package P; sub new { my ($proto) = @_; my $self = {}; bless $self => $proto; } sub foo { print "P: foo\n"; } sub bar { print "P: bar\n"; } package Pprime; @Pprime::ISA = qw(P); sub new { my ($proto) = @_; my $self = {}; bless $self => ref($proto) || $proto; } package Q; sub new { my ($proto) = @_; my $self = {}; bless $self => $proto; } sub bar { my $self = shift; print "Q: bar\n"; $self->SUPER::bar(); } sub test { my $self = shift; $self->foo(); $self->bar(); } package Qprime; @Qprime::ISA = qw(Q Pprime); sub new { my ($proto) = @_; my $self = {}; bless $self => ref($proto) || $proto; } package main; my $obj = Qprime->new(); $obj->test(); #### P: foo Q: bar Can't locate object method "bar" via package "Q" (perhaps you forgot to load "Q"?) at ./demo.pl line 40.