package A; sub new { bless {}, shift; } sub doit { my $self = shift; warn 'A::doit'; } 1; #### package B; use base 'A'; sub doit { my $self = shift; warn 'B::doit'; $self->SUPER::doit(); } 1; #### package C; use base 'B'; 1; #### package D; sub new { bless {}, shift; } sub doit { my $self = shift; warn 'D::doit'; } 1; #### use C; my $c = new C; $c->doit(); #### use C; use D; unshift @C::ISA, 'D'; *C::doit = \&B::doit; my $c = new C; $c->doit();