Как обновить мета-информацию унаследованных классов лося?

Я не знаю, правильно ли я задал этот вопрос, но я постараюсь объяснить.

У меня есть базовый класс 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,

Другие вопросы по тегам