Multiple Inheritance can be tricky, particularly when you get wild and crazy and have an unbalanced inheritance graph:
{
package Platypus;
our @ISA = qw;
package Duck;
our @ISA = 'SpareParts';
sub quack {}
package SpareParts;
our @ISA = 'Animal';
sub quack {}
package Animal;
}
See the bug? It's right there, staring you in the face.
Does this help?
Animal
|
SpareParts
| |
| Duck
| |
Platypus
As both 'SpareParts' and 'Duck' have a 'quack' method, the one in 'Duck' is unreachable if the Platypus inherits from the SpareParts first.
my $platypus = Class::Sniff->new({
class => 'Platypus',
});
explain $platypus->unreachable;
That correctly reported Duck::quack as unreachable. I'm really quite astonished that it seems to be working.
Oh, and I've already removed an unneeded method in TAP::Parser which I detected with this.
I've now added support for listing all classes which multiply inherit and there's optional 'UNIVERSAL' support, if needed.
While you're analysing object/inheritance trees, one case that was in my old non-CPAN equivalent tested for the following.
Class: Foo::Bar
Method: Foo->Bar
Resulting bug?
Foo::Bar->baz parses as Foo::Bar()->baz, forcing you to do Foo::Bar::->baz instead (or something like that...)