Типы лосей великолепны, но иногда вам нужно быть более конкретными.Вы все знаете эти правила типа данных: этот параметр может быть только 'A'
, 'B'
или 'C'
, или только символом валюты, или должен соответствовать некоторому регулярному выражению.
Посмотрите наВ следующем примере, который имеет два ограниченных атрибута, один должен быть либо 'm'
или 'f'
, другой должен быть действительной датой ISO.Как лучше в Moose указать эти ограничения?Я бы подумал о предложении SQL CHECK
, но в AFAICS нет ключевого слова check
в Moose.Поэтому я использовал trigger
, но это звучит неправильно.У кого-нибудь есть лучший ответ?
package Person;
use Moose;
has gender => is => 'rw', isa => 'Str', trigger =>
sub { confess 'either m or f' if $_[1] !~ m/^m|f$/ };
has name => is => 'rw', isa => 'Str';
has dateOfBirth => is => 'rw', isa => 'Str', trigger =>
sub { confess 'not an ISO date' if $_[1] !~ m/^\d\d\d\d-\d\d-\d\d$/ };
no Moose;
__PACKAGE__->meta->make_immutable;
package main;
use Test::More;
use Test::Exception;
dies_ok { Person->new( gender => 42 ) } 'gender must be m or f';
dies_ok { Person->new( dateOfBirth => 42 ) } 'must be an ISO date';
done_testing;
Вот что я использовал в итоге:
package Blabla::Customer;
use Moose::Util::TypeConstraints;
use Moose;
subtype ISODate => as 'Str' => where { /^\d\d\d\d-\d\d-\d\d$/ };
has id => is => 'rw', isa => 'Str';
has gender => is => 'rw', isa => enum ['m', 'f'];
has firstname => is => 'rw', isa => 'Str';
has dateOfBirth => is => 'rw', isa => 'ISODate';
no Moose;
__PACKAGE__->meta->make_immutable;
Это версия Moose 1.19, на случай, если это имеет значение.Я получил следующее предупреждение за неправильный синтаксис subtype as => 'Str', where => { ... }
, который я ошибочно ввел: Calling subtype() with a simple list of parameters is deprecated
.Поэтому мне пришлось немного изменить его в соответствии с прекрасным руководством.