需要做类似下一个(以及更多)的事情:
my $val1 = My::Module::Type1->new(...);
my $val2 = My::Module::Type2->new(...);
my $some = Some->new( val => [$val1, $val2] );
如何在$val
包中定义Some
(基于Moose)?所以,
package Some;
use Moose;
has 'val' => (
isa => 'ArrayRef[My::Module::__ANYTHING__HERE__]', # <-- here is the problem
);
现在问题只有My::Module::Type1
但是如何构建Some->val
以接受任何未来My::Module::_something_
?
我最好的想法是
use Moose;
use Moose::Util::TypeConstraints;
usa Scalar::Util qw( blessed );
subtype MySubModule,
as Object => where {
blessed $_ =~ /^My::Module/
},
message { "Need My::Module class" };
has val => ( is => 'rw', isa => 'ArrayRef[MySubModule]' );
但我不认为这是一种最好的方式,因为如果有人将Your::Module
作为My::Module
的子类会怎么样?
有人可以给我一些更正确的解决方案吗?
(可能需要一些角色,(或特征),但(诚实地) - 仍然从未使用任何角色 - 并且不知道如何使用它们。;()
我希望以上内容是可以理解的 - 不幸的是,我的英语与我的perl相似...;(
答案 0 :(得分:1)
使用类类型约束。它尊重继承......
use Moose;
use Moose::Util::TypeConstraints;
class_type 'MyModule', { class => 'My::Module' };
has val => ( is => 'rw', isa => 'ArrayRef[MyModule]' );
或更好(虽然记住我有偏见)......
use Moose;
use Types::Standard -types;
has val => (is => 'rw', isa => ArrayRef[InstanceOf['My::Module']]);