0

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

$new_class->meta->add_method( some_name => sub {
 my ($self) = @_;
 ...
})

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

请注意,$self上面的子里面是MooseX::Role::Parameterized::Meta::Role::Parameterizable

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

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

);

为什么不是$objectsome_type 类型,它有些丑陋 MooseX::Role::Parameterized::Meta::Role::Parameterizable,我如何获得 some_type 类型的对象?

4

3 回答 3

1

要回答您的第二个问题,原因是因为 Perl 的 OO 不允许您仅向类的一个实例添加方法,因此 Moose 必须通过使用额外方法创建子类并将唯一对象重新添加到其中来伪造它子类。

请注意,如果您正确地做事并使用 、 和/或而不是通过尝试依赖对象的祝福包的名称进行自省isahas那么does这无关紧要。对象仍然是isasome_type、hassome_type 的所有属性和doessome_type 的所有角色,即使它现在被祝福到一个带有丑陋的自动生成名称的包中。

于 2010-03-10T11:13:05.703 回答
0

It sounds like your underlying problem is nearly exactly what I described at this question: from within the role definition, you need to get at the class (and its meta-class) of the object or class the role is being applied to. This isn't possible from within normal roles, but it's possible through parameterized roles.

于 2010-03-10T17:26:04.797 回答
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 { … });

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

如前所述,我不确定这是否能回答您的问题。

于 2010-03-24T20:19:03.890 回答