Moose属性 - 接受具有共同父级的多个模块

时间:2013-12-07 22:09:51

标签: perl moose

需要做类似下一个(以及更多)的事情:

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相似...;(

1 个答案:

答案 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']]);