package Foo; sub bar { print "Original Foo::bar\n"; } package main; sub switcheroo { my ($pkg, $func) = @_; my $old_ref = do { no strict 'refs'; \&{"$pkg\::$func"}; }; my $new_ref = sub { print "New $func\n"; $old_ref->(); }; { no strict 'refs'; *{"$pkg\::$func"} = $new_ref; } } Foo::bar(); switcheroo("Foo", "bar"); Foo::bar();