package A; sub AUTOLOAD { my ($fn) = $AUTOLOAD =~ /^.*::(.+)$/; return if $fn eq 'DESTROY'; *{$AUTOLOAD} = sub { print "$AUTOLOAD $fn"; }; goto &$AUTOLOAD; } package B; @ISA = "A"; package C; @ISA = "A"; package main; $a = bless {}, 'A'; $b = bless {}, 'B'; $c = bless {}, 'C'; $a->shared; # call via baseclass first $b->shared; $c->shared; $b->not_shared; # call via one subclas $c->not_shared; # then another $a->not_shared; # then base class print "\nshared CODE refs:"; print $a->can('shared'); print $b->can('shared'); print $c->can('shared'); print "\nnot_shared CODE refs:"; print $a->can('not_shared'); print $b->can('not_shared'); print $c->can('not_shared');