5

当该角色应用于班级时,我Moose::Role想在班级上调用一些额外的潜艇。

有没有一种简单的方法可以修改应用角色时发生的情况,而不必深入研究Moose::Meta::Role类型编码?理想情况下,我只想after 'apply' => ...添加额外的东西。

编辑:

我专门将它与DBIx::Class::Core结果定义一起使用来创建类似组件的东西,它也修改了构造函数。BUILDARGS如果我能得到结果,我会把它写成一个组件BUILD,但我似乎做不到。所以,load_component我没有做with 'role',而是做,但组件的一些效果是向belongs_to类添加关系。因此,我认为最好的方法是在将角色应用到班级期间。

4

3 回答 3

4

在一个简短的评论中,我提到了你这个问题,它讨论了如何访问角色所应用到的类的元类(例如,您可以有条件地构建到该类上)。但是,为您提供该信息的 MooseX::Role::Parameterized 的使用确实很臭,而且如果该角色被应用于另一个角色,而不是一个类,它也将不起作用。

作为替代方案,您可以编写一个糖函数来接收元信息,并以这种方式构建到类上:

sub foo
{
     my ($meta, %options) = @_;

     # based on what is present in %options, add additional attributes...
     $meta->add_attribute(...);
}

有关编写糖函数的示例,请参阅Moose::Cookbook::Extending::Recipe4 。

于 2010-10-31T19:14:41.130 回答
1

您可以使用参数化角色教程中有一个关于如何访问消费类的示例。话虽如此,我建议您加入 Moose 和 DBIx-Class IRC 频道或邮件列表,以寻找这方面的最佳实践。

于 2010-10-31T19:11:21.550 回答
0

我发现可行、紧凑并且似乎与文档中的意图一致的是使用特征来修改我的特定角色使用的元角色:

package DBIx::Class::Meta::Role::MyRole;
use Moose;
BEGIN { extends 'Moose::Meta::Role'; }
after 'apply' => sub {
## ..my mods to add extra relationships to DBIx::Class::Core result
};
no Moose;

package DBIx::Class::MyRole;
use Moose::Role -metaclass => 'DBIx::Class::Meta::Role::MyRole';
于 2010-10-31T21:45:30.570 回答