有没有办法在对象创建时强制MooseX :: Traits插件之间的依赖关系?

时间:2011-09-06 12:58:19

标签: perl moose traits

假设我有一个类Foo,其中包含插件特征/角色BarBaz,其中Baz依赖于Bar

package Foo;
use Moose;
with 'MooseX::Traits';
sub foo {print "foo\n"}

package Bar;
use Moose::Role;
sub bar {
    shift->foo; 
    print "bar\n";
}

package Baz;
use Moose::Role;
requires 'bar';
sub baz {
    shift->bar; 
    print "baz\n";
}

package main;
my $foo = Foo->new_with_traits( traits => [qw/Bar Baz/] );
$foo->baz;

在此示例中,我使用requires 'bar'强制执行了依赖项。但是,我想要做的是Baz要求整个角色Bar强制插件之间的依赖关系。

我能用这么简单的方法吗?或者您对替代方法有什么建议吗?

2 个答案:

答案 0 :(得分:2)

以您已经演示的方式进行操作是有意义的。这是因为角色提供的属性和方法应足以使其与您的界面兼容。

如果您依靠名称依赖于特定角色,那么您将无法提供具有不同包名称的多态角色,而如果依赖于通过界面可用的某些属性,则可以。

答案 1 :(得分:1)

Cubabit所说的一切都是真的。最好是强制依赖API而不是特定的Implmentation或Type。但是,要回答您的具体问题,将BazBar联系起来的方式就是让它自己组成Bar

package Baz { 
    use Moose::Role;
    with qw(Bar);
    ...
}

然后,您只需在运行时使用Baz单独使用Foo

my $foo = Foo->with_traits('Baz')->new(...);

$foo然后does() BazBar