我有一个Moose::Role
,当该角色应用于班级时,我想在课堂上调用一些额外的潜艇。
是否有一种简单的方法可以修改应用角色时发生的情况,而无需过多地研究Moose::Meta::Role
类型编码?理想情况下,我只想after 'apply' => ...
添加额外的内容。
编辑:
我特意使用DBIx::Class::Core
结果定义来创建类似于也修改构造函数的组件。如果我能够得到BUILDARGS
和BUILD
个子结果,我会把它写成一个组件,但我似乎无法做到。因此,我执行load_component
而不是执行with 'role'
,但该组件的一些效果是将belongs_to
关系添加到类中。因此,我认为最好的方法是在将角色应用到班级时。
答案 0 :(得分:4)
在一篇简短的评论中,我向您推荐了this question,其中讨论了如何访问角色所应用的类的元类(例如,您可以有条件地构建到类上)。但是,对于提供这些信息的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。
答案 1 :(得分:1)
您可以使用parameterized role。有一个关于如何访问tutorial中的消费类的示例。话虽如此,我建议您加入Moose和DBIx-Class IRC频道或邮件列表,以寻找这方面的最佳实践。
答案 2 :(得分: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';