use Data::Dumper; { package Foo; sub new { my ($class) = @_; { no strict 'refs'; *{"$class\::run"} = sub { my $self = shift; my $class = ref($self); print "in $class, but in " . __PACKAGE__ . " \n"; $self->SUPER::run(); print "in $class \n"; }; } bless {}, $class; } sub run { my $self = shift; print "in " . __PACKAGE__ . "\n"; print "now going down\n"; print "in " . __PACKAGE__ . "\n"; } } { package Foo::Bar; use base qw(Foo); } { package Foo::Bar::Baz; use base qw(Foo::Bar); } { package Foo::Bar::Baz::Mod; use base qw(Foo::Bar::Baz); } my $obj = Foo::Bar::Baz::Mod->new(); $obj->run;