Как обновить мета-информацию унаследованных классов лося?
Я не знаю, правильно ли я задал этот вопрос, но я постараюсь объяснить.
У меня есть базовый класс MyClass.pm:
use MooseX::Declare;
class MyClass {
method test_it {
for (__PACKAGE__->meta->get_all_methods){
print $_->name . "\n";
}
}
}
И еще один класс MyOtherClass.pm:
use MooseX::Declare;
class MyOtherClass extends MyClass {
method one {
return 1;
}
method two {
return 1;
}
method three {
return 1;
}
}
И скрипт use_it.pl:
#!/usr/bin/perl
use strict;
use warnings;
use MyClass;
use MyOtherClass;
my $class = MyOtherClass->new;
my $otherclass = MyOtherClass->new;
print "MyClass can:\n";
$class->test_it;
print "MyOtherClass can:\n";
$otherclass->test_it;
exit 0;
Выход:
MyClass может: свалка DEMOLISHALL мета делает новый УНИЧТОЖИТЬ BUILDALL BUILDARGS Попробуй это ДЕЛАЕТ MyOtherClass может: свалка DEMOLISHALL мета делает новый УНИЧТОЖИТЬ BUILDALL BUILDARGS Попробуй это ДЕЛАЕТ
Поэтому, если я вызываю test_it в MyClass, вывод содержит ожидаемый "test_it" вместе с некоторыми встроенными методами. Вызов test_it для MyOtherClass приводит к тому же результату с отсутствием одного, двух и трех.
Как я могу получить список методов, который содержит все методы класса наследования?
1 ответ
Решение
Ты хочешь $self->meta->get_all_methods
не __PACKAGE__->meta->get_all_methods
, __PACKAGE__
связан с Perl во время компиляции, поэтому он всегда будет MyClass
,