Почему я могу использовать имя класса в качестве типа Moose, но не когда оно является частью объединения типов? - PullRequest
13 голосов
/ 04 марта 2011

Я могу сделать это:

package Foo; 
use Moose; 

has 'time' => (
    is => 'rw', 
    isa => 'DateTime'
);

package main;
use DateTime; 

my $a = Foo->new(time => DateTime->now);

Но не это:

package Foo; 
use Moose; 

has 'time' => (
    is => 'rw', 
    isa => 'DateTime | Str'
);

package main;
use DateTime; 

my $a = Foo->new(time => DateTime->now);

Как возникает исключение:

Could not locate type constraint (DateTime) for the union
at /opt/xt/xt-perl/lib/site_perl/5.8.8/Moose/Util/TypeConstraints.pm line 89

Без предварительного определения подтипа. Почему это так, и есть ли способ обойти это (кроме определения подтипа, который проверяет 'isa')?

1 Ответ

19 голосов
/ 04 марта 2011

Когда Moose создает объединение типов, он должен знать все компоненты объединения. В этом случае он еще не знает тип DateTime. Однако, когда вы создаете атрибут в Moose, а Moose не распознает тип, он предполагает, что вы хотите указать тип класса строки в isa и просто делаете это. Вы можете решить вашу проблему, просто загрузив Moose :: Util :: TypeConstraints и выполнив

class_type 'DateTime';
...