2012-05-30 27 views
3

我有一個組成鼠標角色的Moose類。Moose屬性如何能夠「做」鼠標角色?

package My::Moose::Class; 
use Moose; 
has 'mouse_obj' => (
    is => 'ro', 
    does => 'NotMy::Mouse::Role', 
); 

package NotMy::Mouse::Role; 
use Mouse::Role; 

package NotMy::Mouse::Class; 
use Mouse; 
with 'NotMy::Mouse::Role'; 

而且由於鼠標的作用不被認爲是在穆斯一種類型,這將得到一個錯誤:

my $f = My::Moose::Class->new(mouse_obj => NotMy::Mouse::Class->new); 

屬性(mouse_obj)不通過類型約束,因爲:驗證失敗'NotMy ::鼠標::角色',值爲NotMy ::鼠標:: CLASS = HASH(0x23932dc)(未ISA NotMy ::鼠標::角色)在...

有什麼辦法來獲得這工作沒有changin g鼠標移動到Moose上嗎?

回答

1

你可以做到這一點的一種方法是做一個自定義類型約束,做你想要的檢查。

use Moose::Util::TypeConstraints; 

subtype 'MouseRole' 
    => as 'Object' 
    => where sub { $_->does('NotMy::Mouse::Role') }; 

has 'mouse_obj' => (
    is => 'ro', 
    isa => 'MouseRole', # "isa" not "does"! 
);