如何使用Moose with Perl在参数化角色的方法中访问在运行时创建的方法内的使用者类的方法?

时间:2010-03-10 06:49:20

标签: perl roles moose

我在参数化角色中定义了一个方法,该方法需要在运行时创建一个新类 使用Moose::Meta::Class->create并将精确的参数化角色应用于它。我也在使用

为该角色制作新方法
$new_class->meta->add_method( some_name => sub {
 my ($self) = @_;
 ...
})

在子{...}内部我想访问消费者类的方法并将其用于某些事情,我尝试使用$self->get_method,它没有用,我该怎么做?< / p>

请注意,上面子内的$selfMooseX::Role::Parameterized::Meta::Role::Parameterizable

如果我这样做,我还有另一个问题:

my $object = Moose::Meta::Class->create(
       "some_type",

);

为什么不是类型为some_type的$object而且它是一些丑陋的MooseX::Role::Parameterized::Meta::Role::Parameterizable,我如何找到some_type类型的对象?

3 个答案:

答案 0 :(得分:1)

要回答你的第二个问题,原因是因为Perl的OO不允许你只为一个类的一个实例添加一个方法,所以Moose必须通过使用额外的方法创建子类并重新使用唯一的方法来伪造它。对象进入该子类。

请注意,如果您正确地执行操作并使用isahas和/或does进行内省,而不是尝试依赖对象的名称而受到祝福包,这没关系。该对象仍然是isa some_type,has所有some_type的属性,以及does所有some_type的角色,即使它现在被祝福到一个包含丑陋的自动生成名称的包中。

答案 1 :(得分:0)

听起来你的潜在问题几乎就是我在this question所描述的:在角色定义中,你需要获得对象或类的类(及其元类)角色是适用于。这在普通角色中是不可能的,但可以通过参数化角色来实现。

答案 2 :(得分:0)

我不太确定你在这里要做什么。我们假设你有

my $new_class = Moose::Meta::Class->create('FooBar');

然后$new_class FooBar的元对象。因此,如果您想要将方法添加到FooBar,您会说

$new_class->add_method(foo => sub { … });

基本上与

相同
FooBar->meta->add_method(foo => sub { … });

您还应该使用Moose::Util中的find_meta()。这将返回正确的元对象(如果有的话),即使您的类没有meta方法,也不会将其用于其他方法。

如上所述,我不确定这会回答你的问题。