use strict; use warnings; package Bar; sub f1 { print "there @_\n"; } package Foo; for (keys %Bar::) { if (exists &{$Bar::{$_}}) { no warnings 'redefine'; my $func = \&{$Bar::{$_}}; $Bar::{$_} = sub { print "hello "; goto &$func; }; } } package main; Bar::f1("Bob");