【问题标题】:Moose::Role - easy way to augment application of the role?Moose::Role - 增加角色应用的简单方法?
【发布时间】:2010-10-31 17:37:44
【问题描述】:

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

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

编辑:

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

【问题讨论】:

  • 你能澄清一下你想做什么吗?你会在你假设的after 'apply' sub 中加入什么?这种对 MOP 的修改通常不会进行,因此几乎可以肯定有一种更简单的方法可以完成您想做的事情。
  • @Ether:当然,编辑了更多解释。
  • 你试过after BUILD => sub { ... }担任你的角色吗?
  • @Ether:是的,这是可行的——这就是我作为一个角色来做这件事的原因。然而,一些可以在组件中完成的事情我似乎无法在角色中完成(比如添加关系)。目前,我已经编写了一个组件,除了做组件化的事情之外,它还加载了角色——但这看起来很傻。它应该都在一个地方。

标签: perl moose role


【解决方案1】:

在一个简短的评论中,我将您推荐给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

【讨论】:

  • 你如何看待使用traits来修改Moose::Meta::Role?这在文档中被描述为对元角色进行简单修改的​​方式。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    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';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多