sub caller { [yadda yadda] my $args = []; do { $result = $f->($args); [yadda yadda] } while ($f); return ($result); } sub as_list { my $args = shift; my ($arg1, $arg2, $arg3) = @$args; @$args = (); [...] } sub as_stack { my $args = shift; my $item = pop @$args; [...] push @args, $result; return ([true|false]); } sub as_queue { my $args = shift; my $item = shift @$args; [...] push @args, $result; return ([true|false]); }