sub _onmatch_fail
{
my ( $self, $_codetext, $_valhref, $_taskname ) = @_;
my $FAIL_MATCH = 0; # match defaults to succeed
my $_codetext = "# line 1 task[$_taskname]\n" . $_codetext;
{
use Alias qw(attr);
attr $_valhref;
no Alias;
no warnings qw(once);
no strict qw(vars);
eval $_codetext;
die $@ if $@;
return $FAIL_MATCH;
}
}
####
package App::Tasker::Exec;
sub _onmatch_fail
{
my ( $_codetext, $_valhref, $_taskname ) = @_;
@_ = ();
{
my $FAIL_MATCH = 0; # match defaults to succeed
my $evaltext = '';
my $epilog = '';
my $_newval = {};
while ( my ( $k, $v ) = each %$_valhref )
{
$evaltext .= <{'$k'} = \$$k;
EOT
}
$evaltext .= "# line 1 task[$_taskname]\n" . $_codetext;
$evaltext .= $epilog;
eval $evaltext;
die $@ if $@;
for my $k ( keys %$_valhref )
{
$_valhref->{$k} = $_newval->{$k};
}
return $FAIL_MATCH;
}
}
####
package App::Tasker::SafeExec;
sub _onmatch_fail
{
my ( $_codetext, $_valhref, $_taskname ) = @_;
$_codetext .= "# line 1 task[$_taskname]\n" . $_codetext;
{
use Safe;
my $_compartment = new Safe;
our $FAIL_MATCH = 0; # match defaults to succeed
my $_epilog = '';
my $_newval = {};
my $_evaltext = <<'EOT';
$_compartment->share('$FAIL_MATCH');
EOT
while ( my ( $k, $v ) = each %$_valhref )
{
$_evaltext .= <share('\$$k');
EOT
$_epilog .= <{'$k'} = \$$k;
EOT
}
$_evaltext .= <<'EOT';
$_compartment->reval($_codetext, 1);
die $@ if $@;
EOT
$_evaltext .= $_epilog;
eval $_evaltext;
die $@ if $@;
for my $k ( keys %$_valhref )
{
$_valhref->{$k} = $_newval->{$k};
}
return $FAIL_MATCH;
}
}