# Impure sub walk_and_do { my $self = shift; foreach my $child (@{$self->children}) { return 0 unless $child->walk_and_do; } return 0 unless $self->do_my_stuff; return 1; } ##### # Pure sub walk_and_do { my $self = shift; my $rc = 1; foreach my $child (@{$self->children}) { $rc = $child->walk_and_do; last unless $rc; } unless ($rc) { $rc = $self->do_my_stuff; } return $rc; }