{ package Foo; sub new { bless {}, shift; } 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); sub run { my $self = shift; print "in " . __PACKAGE__ . "\n"; $self->SUPER::run(); print "in " . __PACKAGE__ . "\n"; } } { package Foo::Bar::Baz; use base qw(Foo::Bar); sub run { my $self = shift; print "in " . __PACKAGE__ . "\n"; $self->SUPER::run(); print "in " . __PACKAGE__ . "\n"; } } { package Foo::Bar::Baz::Mod; use base qw(Foo::Bar::Baz); sub run { my $self = shift; print "in " . __PACKAGE__ . "\n"; $self->SUPER::run(); print "in " . __PACKAGE__ . "\n"; } } my $obj = Foo::Bar::Baz::Mod->new(); $obj->run; ca marche et ca donne : in Foo::Bar::Baz::Mod in Foo::Bar::Baz in Foo::Bar in Foo now going down in Foo in Foo::Bar in Foo::Bar::Baz in Foo::Bar::Baz::Mod