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

对照非Moose类检查Moose角色

  •  3
  • jeje  · 技术社区  · 14 年前

    package MyMooseClass;
    use Moose;
    
    has 'a' => ( does => 'MyRole' );
    

    现在,我想构建一个MyMooseClass的实例,如下所示:

    my $instance = MyMooseClass->new( { a => $a_non_moose_stuff } );
    

    其中$a\u non\u moose\u stuff是非moose类的实例,但它实现了所需的角色方法。

    有没有办法让Moose检查我的$a\u non\Moose\u东西是否符合角色,即使它不是用Moose实现的?

    1 回复  |  直到 14 年前
        1
  •  5
  •   cjm    14 年前

    最简单的方法是使用duck类型而不是角色来验证接口。duck\u类型是一个更宽松的限制,基本上duck\u类型只是对象应该具有的方法的列表。例如:

    package MyMooseClass;
    use Moose;
    use Moose::Util::TypeConstraints qw/duck_type/;
    
    has 'a' => (
      isa => duck_type(qw/method1 method1 some_other_method/),
    );
    

    Moose::Util::TypeConstraints 向下滚动一点直到你看到 duck_type . 这个约束是专门为处理这类问题而添加的。

    如果要大量重用此约束,可能需要考虑在类型库类中创建它,这将促进重用。退房 MooseX::Types .

    顺便说一句,虽然在构造函数中使用散列引用是受支持的,而且在Moose被认为是最佳实践之前的很长一段时间里,我认识的大多数Moose作者都跳过它,只提供一个构造函数参数列表。在我看来,它打字少了一点,而且看起来更干净:

    my $instance = MyClass->new(param1=>'val1', param2=>'val2');
    

    别紧张,

    约翰