use Scalar::Util; { package Before; my %hUnwrapped; sub new { my ($sClass,$f) = @_; my $fBefore= sub { print "Special stuff for class $sClass\n"; goto &$f }; $hUnwrapped{Scalar::Util::refaddr($fBefore)}=$f; return bless($fBefore,$sClass); } sub i_know_what_im_doing { my $k = Scalar::Util::refaddr(shift); goto $hUnwrapped{$k}; } } my $f1=Before->new(sub {print "Hello @_!\n";}); print "Wrapped sub\n-------------\n"; $f1->('tweedledum','tweedledee'); print "\nUnwrapped sub\n-------------\n"; $f1->i_know_what_im_doing('walrus','carpenter');