{ package Foo; sub init_stuff { my ($class) = @_; print " - setting up $class\n"; { no strict 'refs'; *{"$class\::run"} = sub { my ($self) = @_; my $local_class = ref($self); print "class is $local_class, package is : " . __PACKAGE__ . "\n"; print "EVALUATING : " . qq{ package $local_class; \$self->SUPER::run() }; eval qq{ package $local_class; \$self->SUPER::run() }; print "class is $local_class, package is : " . __PACKAGE__ . "\n"; }; } } sub new { my ($class) = @_; bless {}, $class; } sub run { my $self = shift; print "package is : " . __PACKAGE__ . "\n"; print "now going down\n"; print "package is : " . __PACKAGE__ . "\n"; } } { package Foo::Bar; use base qw(Foo); __PACKAGE__->init_stuff(); } { package Foo::Bar::Baz; use base qw(Foo::Bar); __PACKAGE__->init_stuff(); } { package Foo::Bar::Baz::Mod; use base qw(Foo::Bar::Baz); __PACKAGE__->init_stuff(); } my $obj = Foo::Bar::Baz::Mod->new(); $obj->run;