代码之家  ›  专栏  ›  技术社区  ›  Carl

Role—扩充角色应用程序的简单方法?

  •  5
  • Carl  · 技术社区  · 14 年前

    我有一个 Moose::Role 当这个角色被应用到类时,我想在类上调用一些额外的sub。

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

    编辑:

    DBIx::Class::Core 结果定义,以创建类似组件的内容,该组件还修改构造函数。如果我能找到 BUILDARGS BUILD load_component ,我在做 with 'role' ,但是组件的一些效果是 belongs_to 与班级的关系。因此,我认为最好的方法是在将角色应用到类中。

    3 回复  |  直到 14 年前
        1
  •  4
  •   Community CDub    8 年前

    在简短的评论中我提到你 this question ,其中讨论了如何访问要应用角色的类的元类(例如,以便可以有条件地构建到该类上)。然而,这是MooseX::Role::parametized的一个非常糟糕的用法,如果角色被应用到另一个角色,而不是一个类,那么它也不会工作。

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

    sub foo
    {
         my ($meta, %options) = @_;
    
         # based on what is present in %options, add additional attributes...
         $meta->add_attribute(...);
    }
    

    Moose::Cookbook::Extending::Recipe4

        2
  •  1
  •   phaylon    14 年前

    你可以用一个 parameterized role . 有一个关于如何访问 tutorial

        3
  •  0
  •   Carl    14 年前

    我发现它很有效,很紧凑,并且似乎与文档中的意图一致,就是使用一个特性来修改我的特定角色使用的元角色:

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