{ package Baz; sub new { my $class = shift; if ($class ne 'Baz') { if ($class->can('foo') != Baz->can('foo')) { die "Don't do that $class"; } } bless {}, $class; } sub foo { 'foo'; } sub boo { 'foo'; } } { package Foo; our @ISA = 'Baz'; sub foo { 'Foo'; } sub boo { 'Foo'; } } { package Boo; our @ISA = 'Foo'; sub boo { 'Boo'; } } { package Goo; our @ISA = 'Baz'; sub boo { 'Boo'; } } my ($a, $b, $c); eval { $a = new Baz; }; warn $@ if $@; eval { $c = new Foo; }; warn $@ if $@; eval { $b = new Boo; }; warn $@ if $@; eval { $b = new Goo; }; warn $@ if $@;