/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;