#!perl use strict; use warnings; use Test::More tests => 2; # hide package Outer (a little stupidly) sub my_caller { my $package = CORE::caller(@_); $package = 'main' if $package eq 'Outer'; return $package; } # redefine both caller (which fails) and glob (which works) *CORE::GLOBAL::caller = \&my_caller; *CORE::GLOBAL::glob = \&my_caller; # actual tests my ($got_caller, $got_glob); Outer::outer(); is($got_caller, 'main', 'redefined caller in all packages'); is($got_glob, 'main', 'redefined glob in all packages'); { package Inner; sub inner { $got_caller = caller(); $got_glob = glob(); } } { package Outer; sub outer { Inner::inner() } } __END__ 1..2 Name "CORE::GLOBAL::caller" used only once: possible typo at test.t line 14. Subroutine CORE::GLOBAL::glob redefined at test.t line 15. not ok 1 - redefined caller in all packages # Failed test 'redefined caller in all packages' # at test.t line 20. # got: 'Outer' # expected: 'main' ok 2 - redefined glob in all packages # Looks like you failed 1 test of 2.