2011-09-06 60 views
0

假設我有一個具有插件特性/角色BarBazFoo類,其中Baz依賴於Bar有沒有辦法在對象創建時強制MooseX :: Traits插件之間的依賴關係?

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

按照您已經演示的方式進行操作是有意義的。這是因爲角色提供的屬性和方法應該足以使其與您的界面兼容。

如果你要依靠特定的角色名稱,那麼你就不能提供具有不同包名稱的多態角色,而如果你依賴於通過接口可用的特定屬性,那麼你可以。

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()BazBar

相關問題