no warnings 'redefine'; my $real_new; BEGIN { $real_new = Foo->can( 'new' ) } *Foo::new = sub { if (caller() eq 'Bar') { print "Returning real Foo.\n"; return Foo->$real_new(); } print "Returning fake Foo.\n"; return FakeFoo->new; };