package Before; my %looper; use overload '&{}' => sub { my ( $f ) = @_; my $fs = overload::StrVal($f); if( $looper{$fs} ){ print "$fs got looper already\n"; return $looper{overload::StrVal($f)}; } else { my $looper = 0; my $s = sub { $looper++; print "$fs Stuff before (looper=$looper)\n"; goto &$f unless $looper > 1; }; $looper{$fs} = $s; return $s; } }; package main; ( bless sub {} => 'Before' )->() __END__ Before=CODE(0x18305e4) Stuff before (looper=1) Before=CODE(0x18305e4) got looper already Before=CODE(0x18305e4) Stuff before (looper=2)