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

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

У меня есть базовый класс 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 can:
dump
DEMOLISHALL
meta
does
new
DESTROY
BUILDALL
BUILDARGS
test_it
DOES
MyOtherClass can:
dump
DEMOLISHALL
meta
does
new
DESTROY
BUILDALL
BUILDARGS
test_it
DOES

Так что, если я вызываю test_it на MyClass, вывод содержит ожидаемый "test_it" наряду с некоторыми встроенными методами. Вызов test_it для MyOtherClass приводит к тому же выводу, при этом пропускаются один, два и три.

Как получить список методов, который содержит все методы класса наследования?

1 Ответ

4 голосов
/ 12 января 2011

Вы хотите $self->meta->get_all_methods, а не __PACKAGE__->meta->get_all_methods.__PACKAGE__ связан с Perl во время компиляции, поэтому он всегда будет MyClass.

...