webgui/lib/WebGUI/Upgrade/File/pl.pm
2010-07-06 06:16:28 -05:00

61 lines
1.5 KiB
Perl

package WebGUI::Upgrade::File::pl;
use 5.010;
use strict;
use warnings;
use WebGUI::Upgrade::Script ();
use Path::Class::Dir ();
use Try::Tiny;
use namespace::clean;
my $namespace = 0;
my $namespacePrefix = __PACKAGE__ . '::__ANON__::';
sub _runScript {
my $file = shift;
my @res;
my $err;
{
local $@;
local *_;
my $guard = WebGUI::Upgrade::Script->cleanup_guard;
my $wanted = wantarray;
eval sprintf(<<'END_CODE', $namespacePrefix . $namespace);
# place this in a specific separate package to prevent namespace
# pollution and to allow us to clean it up afterward
package %s;
# maintain context
if ($wanted) {
@res = do $file;
}
elsif (defined $wanted) {
$res[0] = do $file;
}
else {
do $file;
}
# save error as soon as possible
$err = $@;
END_CODE
}
{
# delete entire namespace that script was run in
no strict 'refs';
delete ${ $namespacePrefix }{ $namespace . '::' };
}
$namespace++;
die $err
if $err;
return (wantarray ? @res : $res[0]);
}
sub run {
my $class = shift;
my ($configFile, $version, $file, $quiet) = @_;
local $ENV{WEBGUI_CONFIG} = $configFile;
local $ENV{WEBGUI_UPGRADE_VERSION} = $version;
local $ENV{WEBGUI_UPGRADE_QUIET} = $quiet;
return _runScript($file);
}
1;