Acme-Chef
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
lib/Acme/Chef/Recipe.pm view on Meta::CPAN
$ingr->value( $ingr->value() - 1 );
}
return "endloop.$verb";
},
);
=item new
Acme::Chef::Recipe constructor. Arguments are interpreted as key/value pairs
and used as object attributes.
=cut
sub new {
my $proto = shift;
my $class = ref $proto || $proto;
my $self = {};
if (ref $proto) {
%$self = %$proto;
$self->{bowls} = [ map { $_->new() } @{$self -> {bowls }} ];
$self->{dishes} = [ map { $_->new() } @{$self -> {dishes}} ];
$self->{loops} = { map { ( $_, $self->{loops}{$_} ) }
keys %{$self->{loops}} };
if ( $self->{compiled} ) {
$self->{ingredients} = { map {
(
$_,
$self -> {ingredients} -> {$_} -> new()
)
} keys %{ $self->{ingredients} }
};
}
}
my %args = @_;
%$self = (
compiled => 0,
name => '',
comments => '',
ingredients => '',
cooking_time => '',
temperature => '',
method => '',
serves => '',
output => '',
loops => {},
bowls => [],
dishes => [],
%$self,
%args,
);
bless $self => $class;
return $self;
}
=item execute
Executes the recipe (program). First argument should be a reference to a
hash of sous-recipes.
=cut
sub execute {
my $self = shift;
my $recipes = shift;
$self->compile() unless $self->{compiled};
my @loop_stack;
my $max_pos = $#{$self->{method}};
my $exec_pos = 0;
while (1) {
my $next_method = $self->{method}->[$exec_pos];
# print ' ' x scalar(@loop_stack), join(',', @$next_method),"\n";
my $return = $Commands{$next_method->[0]}->($self, $next_method);
last if $return eq 'halt';
if ( $return =~ /^recurse\.([\-\w][\-\w ]*)/ ) {
exists $recipes->{$1}
or croak "Invalid recipe '$1' specified for recursion.";
my $clone = $self->new();
my $sous_recipe = $recipes->{$1}->new(
bowls => $clone->{bowls},
dishes => $clone->{dishes},
);
my $sous_done = $sous_recipe->execute( $recipes );
$self->output( $sous_done->output() );
$self -> {bowls} -> [0]
-> put( $sous_done -> first_bowl() -> new() -> pour() );
} elsif ( $return =~ /^loop\.([^\.]+)\.([^\.]+)/ ) {
my $verb = $1;
my $ingr = $2;
push @loop_stack, $verb;
if ( not $self -> {ingredients} -> {$ingr} -> value() ) {
pop @loop_stack;
$exec_pos = $self -> {loops} -> {$verb} -> {end};
}
view all matches for this distributionview release on metacpan - search on metacpan
( run in 0.430 second using v1.00-cache-2.02-grep-82fe00e-cpan-1925d2aa809 )