检查Moose角色对抗非Moose类

时间:2010-08-31 09:09:13

标签: perl roles moose

假设你有一个需要一个角色属性的Moose类:

package MyMooseClass;
use Moose;

has 'a' => ( does => 'MyRole' );

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

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

其中$ a_non_moose_stuff是非驼鹿类的实例,但实现了所需的角色方法。

有没有办法让Moose检查我的$ a_non_moose_stuff是否符合该角色,即使它没有使用Moose实现?

1 个答案:

答案 0 :(得分:5)

最简单的方法是使用duck_type而不是角色来验证您的界面。 duck_type是一个更宽松的限制,基本上duck_type只是对象应该具有的方法列表。例如:

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

BTW,虽然支持在构造函数中使用哈希引用,并且在Moose认为是最佳实践之前很长一段时间,我知道的大多数Moose作者跳过它并只提供构造函数参数列表。在我看来,打字更少,看起来更干净:

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

哈希参考方法的要点是帮助解决在使用Moose构建Perl对象时实际上不会发生的一些歧义。由于Moose为您处理所有的样板和仪式,我认为这是不必要的,尽管样式确实有所不同。我的两分钱。

放轻松,

约翰