sub increment { my ( $number, $incval ) = @_; return sub { $number += $incval; return $number; } } my $action = increment( 1, 2, 'plus', 'tons', 'more', 'arguments' ); while ( my $result = $action->() ) { print "$result\n"; } #### sub do_something { my $action = shift( @_ ); for ( $action ) { when ( /INCREMENT/ ) { \&increment( @_ ) } default { die "You idiot!" } } } sub increment { my ( $number, $incval ) = @_; return sub { $number += $incval; return $number; } } my $action = do_something( 'INCREMENT', 1, 2, 'long', 'list' ); while ( my $result = $action->() ) { # <-- The error happens here print "$result\n"; }