Запустить приведения внутри пользовательского ограничения Type::Tiny?
У меня есть собственный тип DateTime, для которого определено приведение от строки к DateTime, например:
package Library;
use Type::Library -base, -declare => qw(DateTime);
use DateTime::Format::ISO8601;
class_type DateTime, { class => 'DateTime' };
coerce DateTime, from Str, via { DateTime::Format::ISO8601->parse_datetime($_) };
Я хотел бы использовать этот тип DateTime в Dict, вот так:
package MyObj;
use Moo;
$constraint = declare MyType, as Dict[ name => Str, date => DateTime ];
has 'whatsis' => ( is => 'ro', isa => $constraint );
А затем назовите это как:
use MyObj;
my $obj = MyObj->new( whatsis => { name => 'Something', date => '2016-01-01' } );
Я пытался добавить coerce => 1
к декларации whatsis
, но это не помогло.
Как создать пользовательский тип, который наследуется от Dict и выполняет приведение типов, определенное для типов элементов?
1 ответ
Решение
С большой помощью https://metacpan.org/pod/distribution/Type-Tiny/lib/Type/Tiny/Manual/Coercions.pod
Library.pm:
package Library;
use Type::Library -base, -declare => qw(Datetime);
use Type::Utils -all;
use Types::Standard -all;
use DateTime::Format::ISO8601;
class_type Datetime, { class => 'DateTime' };
coerce Datetime,
from Str, via { DateTime::Format::ISO8601->parse_datetime($_) };
declare 'MyType', as Dict[ name => Str, date => Datetime ], coercion => 1;
MyObj.pm:
package MyObj;
use Moo;
use Library -all;
has 'whatsis' => ( is => 'ro', isa => MyType, coerce => 1 );
tester.pl:
#!perl
use MyObj;
my $obj = MyObj->new( whatsis => { name => 'Something', date => '2016-01-01' } );
use Data::Dumper; print Dumper $obj;