Search code examples
perloopsuperclass

What is the best practice for finding all the superclasses of a Perl class?


Is there a standard CPAN way of finding out all the superclasses of a Perl class (or better yet entire superclass tree, up to UNIVERSAL)?

Or is the best practice to simply examine @{"${$class}::ISA"} for each class, class's parents etc?


Solution

  • There is no "standard way" because this is not a standard thing you want to do. For anything other than visualization it is an OO red flag to want to inspect your inheritance tree.

    In addition to Class::ISA, there is mro::get_linear_isa(). Both have been in core for a while so they could be considered "standard" for some definition. Both of those show inheritance as a flat list, not a tree, which is useful mostly for deep magic.

    The perl5i meta object provides both linear_isa(), like mro (it just calls mro), and ISA() which returns the class' @ISA. It can be used to construct a tree using simple recursion without getting into symbol tables.

    use perl5i::2;
    
    func print_isa_tree($class, $depth) {
        $depth ||= 0;
    
        my $indent = "    " x $depth;
        say $indent, $class;
    
        for my $super_class ($class->mc->ISA) {
            print_isa_tree($super_class, $depth+1);
        }
    
        return;
    }
    
    
    my $Class = shift;
    $Class->require;
    
    print_isa_tree($Class);
    
    __END__
    DBIx::Class
        DBIx::Class::Componentised
            Class::C3::Componentised
        DBIx::Class::AccessorGroup
            Class::Accessor::Grouped