如何更新继承的驼鹿类的元信息?

时间:2011-01-12 15:47:42

标签: perl metadata moose

我不知道我是否以正确的方式提出这个问题,但我会尝试解释。

我有一个基类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

因此,如果我在MyClass上调用test_it,则输出包含预期的“test_it”以及一些内置方法。 在MyOtherClass上调用test_it会产生相同的输出,缺少一个,两个和三个。

如何获取包含继承类的所有方法的方法列表?

1 个答案:

答案 0 :(得分:4)

您需要$self->meta->get_all_methods,而不是__PACKAGE__->meta->get_all_methods__PACKAGE__在编译时受Perl约束,因此它始终为MyClass