最简单的事情是使用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并向下滚动一点,直到您看到Duke_type的条目。此约束是专门为处理此类问题而添加的。
如果您要大量重用此约束,您可能希望考虑在类型库类中创建它,这将促进重用。查看MooseX::Types。
顺便说一句,虽然支持在构造函数中使用哈希引用,并且在 Moose 被认为是最佳实践之前很长一段时间,我认识的大多数 Moose 作者都跳过它,只提供构造函数参数列表。在我看来,它的打字少了一点,看起来更干净了:
my $instance = MyClass->new(param1=>'val1', param2=>'val2');
Hash Reference 方法的主要目的是帮助解决一些在使用 Moose 构建 Perl 对象时真正不会发生的歧义。由于 Moose 会为您处理所有这些样板文件和仪式,我认为这是不必要的,尽管风格确实有所不同。我的两分钱。
别紧张,
约翰