2012-05-30 3 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 :: Mouse :: Class = HASH (0x23932dc) (не иша NotMy :: Мышь :: Роль) в ...

Какие способы получить это работает без изменения g Объекты мыши на лодке?

ответ

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"! 
); 
Смежные вопросы