【发布时间】:2013-12-07 22:09:51
【问题描述】:
需要做类似下一个(以及更多)的事情:
my $val1 = My::Module::Type1->new(...);
my $val2 = My::Module::Type2->new(...);
my $some = Some->new( val => [$val1, $val2] );
如何在Some 包中定义$val(基于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 一样糟糕.. ;(
【问题讨论】:
-
这些都应该是
My::Module的子类吗?因为如果他们是,isa检查就是您所需要的。