# A B # / \ / # C D # \ / # E use NEXT; package A; sub foo { print "called A::foo\n"; shift->NEXT::ACTUAL::UNSEEN::foo() } package B; sub foo { print "called B::foo\n"; shift->NEXT::UNSEEN::ACTUAL::foo() } package C; @ISA = qw( A ); sub foo { print "called C::foo\n"; shift->NEXT::ACTUAL::UNSEEN::foo() } package D; @ISA = qw(A B); sub foo { print "called D::foo\n"; shift->NEXT::UNSEEN::ACTUAL::foo() } package E; @ISA = qw(C D); sub foo { print "called E::foo\n"; shift->NEXT::ACTUAL::UNSEEN::foo() } E->foo();