No hay una "forma estándar" porque esto no es lo estándar que desea hacer. Para cualquier cosa que no sea la visualización, es una bandera roja de OO que desea inspeccionar su árbol de herencia.
Además de Class :: ISA, hay mro::get_linear_isa(). Ambos han estado en core por un tiempo, por lo que podrían considerarse "estándar" para cierta definición. Ambos muestran la herencia como una lista plana, no como un árbol, que es útil sobre todo para la magia profunda.
El perl5i meta object proporciona tanto linear_isa(), como MRO (que sólo llama a MRO), y ISA() que devuelve la clase @ISA
. Se puede usar para construir un árbol usando recursión simple sin ingresar a tablas de símbolos.
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
¿Es esta quizás una pregunta capciosa cuya respuesta es que usted no quiere hacer eso? A veces deberías dejar que el polimorfismo haga su trabajo. Por lo general incluso, tal vez. – tchrist
@tchrist - no hay truco. Nunca tuve que hacer eso (como notaron su comentario y las respuestas, no es algo que uno normalmente debería hacer); de modo que cuando surge la necesidad de considerar "cómo" al responder [esto] (http://stackoverflow.com/questions/10869511/is-there-a-way-to-know-the-methods-of-an-instance -of-an-unknown-class-in-perl/10869712 # 10869712), tuve que enfrentar la necesidad de elegir una implementación AN. Y soy un firme creyente en TIMTOWTDIBSWABTO. – DVK