假设你有一个需要一个角色属性的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实现?
答案 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为您处理所有的样板和仪式,我认为这是不必要的,尽管样式确实有所不同。我的两分钱。
放轻松,
约翰