Почему я могу использовать имя класса в качестве типа Moose, но не в том случае, когда вы являетесь частью союза типов?
Я могу это сделать:
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
Без определения SubType. Почему это, и есть ли способ вокруг него (кроме определения подтипа, который проверяет "isa" )?
Ответы
Ответ 1
Когда Moose создает объединение типов, он должен знать все компоненты объединения. В этом случае он еще не знает тип DateTime. Однако, когда вы создаете атрибут в Moose и Moose, он не распознает тип, он делает предположение, что вы хотите тип класса строки в isa
и просто делает это. Вы можете решить проблему, просто загрузив Moose::Util::TypeConstraints и выполнив
class_type 'DateTime';