Нет стандартного способа, потому что это не стандартная вещь, которую вы хотите сделать. Для чего угодно, кроме визуализации, это красный флаг OO, который хочет проверить ваше дерево наследования.
В дополнение к классу :: ISA, есть mro::get_linear_isa(). Оба были в ядре на некоторое время, поэтому их можно было считать «стандартными» для некоторого определения. Оба они показывают наследование как плоский список, а не дерево, которое полезно в основном для глубокой магии.
perl5i meta object обеспечивает как linear_isa(), как MRO (он просто вызывает MRO), и ISA(), который возвращает класс @ISA
. Его можно использовать для построения дерева с использованием простой рекурсии без попадания в таблицы символов.
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
Возможно, это трюк, ответ на который вы не хотите делать? Иногда вы должны просто позволить полиморфизму делать свое дело. Обычно даже, возможно. – tchrist
@tchrist - не трюк. Мне никогда не приходилось это делать (как отмечено вашим комментарием и ответами, это не то, что обычно нужно делать); так что, когда возникает необходимость рассмотреть вопрос о том, «как» возникла при ответе на это [http://stackoverflow.com/questions/10869511/is-there-a-way-to-know-the-methods-of-an-instance -of-an-unknown-class-in-perl/10869712 # 10869712), я столкнулся с необходимостью выбрать реализацию AN. И я твердо верю в TIMTOWTDIBSWABTO. – DVK