use Data::Dumper; use strict; sub prefix_later { my ($just_once,$and_later) = @_; #passed by calling part, see below my $ct=0; return sub { my (@args) = shift(); #this is just a trick ;-) print Dumper(\@args); print "ct = $ct\n"; #will not be reset to zero, becasue of closure ((!$ct++) ? #only true for the first time sub { print "sub1\n"; $just_once->(@args); #hi mom } : sub { print "sub2\n"; $and_later->(@args); #this was unneccessary: $just_once->(@args); #hi mom } )->(); } } my $hi_mom = prefix_later( sub { print "hi mom\n"; },#this is just once sub { print "this was unneccessary:\n"; } #this is and later ); $hi_mom->() for (1..3);