假设我有一个类Foo
,其中包含插件特征/角色Bar
和Baz
,其中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
强制插件之间的依赖关系。
我能用这么简单的方法吗?或者您对替代方法有什么建议吗?
答案 0 :(得分:2)
以您已经演示的方式进行操作是有意义的。这是因为角色提供的属性和方法应足以使其与您的界面兼容。
如果您依靠名称依赖于特定角色,那么您将无法提供具有不同包名称的多态角色,而如果依赖于通过界面可用的某些属性,则可以。
答案 1 :(得分:1)
Cubabit所说的一切都是真的。最好是强制依赖API而不是特定的Implmentation或Type。但是,要回答您的具体问题,将Baz
与Bar
联系起来的方式就是让它自己组成Bar
。
package Baz {
use Moose::Role;
with qw(Bar);
...
}
然后,您只需在运行时使用Baz
单独使用Foo
。
my $foo = Foo->with_traits('Baz')->new(...);
$foo
然后does()
Baz
和Bar
。