use strict; use warnings; use B::Deparse; { package Before; use overload '&{}' => sub { my ( $f ) = @_; my $s=B::Deparse->new()->coderef2text($f); # note: this will *NOT* work if $f uses package variables # this will also not work if $f uses certain global variables # # namely, if $f uses global variables from # the namespace where it is defined. At least for 5.8.8 # B::Deparse erases the namespace name: i.e. # { package Foo; our $X=100; my $f=sub { print "$Foo::X\n" } } # will be deparsed as: sub { print "${X}\n" }. # Since ${X} is undefined in package Before, # Perl will complain about undefined variables. $f=eval 'sub {'.$s.'}'; return sub { print "Stuff before\n"; goto &$f; } } } my $cr=bless(sub {print "Hello @_\n" },'Before'); $cr->('tweedledum', 'tweedledee'); $cr->('walrus','carpenter');