use NEXT; no strict 'refs'; *{$package . '::function'} = sub { my $this = shift; # do something $this->NEXT::function(@_); }; #### sub printcaller { my $caller = (caller(1))[3]; print "$caller\n"; } my $package = "testpackage"; *{$package.'::function'} = sub { printcaller(); }; testpackage::function(); #### sub printcaller { my $caller = (caller(1))[3]; print "$caller\n"; } my $package = 'testpackage'; eval qq{ sub ${package}::function { printcaller(); } }; testpackage::function(); # Output: testpackage::function