/usr/local/CPAN/Petal-CodePerl/Petal/CodePerl/Expr/Alternate.pm
use strict;
use warnings;
package Petal::CodePerl::Expr::Alternate;
use base qw( Code::Perl::Expr::Base );
use Class::MethodMaker (
get_set => [qw( -java Paths )]
);
sub eval
{
my $self = shift;
my @paths = @{$self->getPaths};
my $last = pop @paths;
foreach my $path (@paths)
{
my $res = eval {$path->eval};
next if $@;
return $res;
}
return $last->eval;
}
sub perl
{
my $self = shift;
my @paths = @{$self->getPaths};
my $last = pop @paths;
my $last_perl = $last->perl;
if (not @paths)
{
return $last_perl;
}
else
{
my @evals = map {
my $path_perl = $_->perl;
qq{eval{\$v = $path_perl}; last unless \$@}
} @paths;
my $evals = join(";", @evals);
return qq{do{my \$v;for (1){$evals;\$v = $last_perl} \$v}}
}
}
1;