Moose types son geniales, pero a veces debe ser más específico. Todos ustedes conocen estas reglas de tipo de datos: ese parámetro solo puede ser 'A'
, 'B'
o 'C'
, o solo un símbolo de moneda, o debe ajustarse a alguna expresión regular.Aplicar comprobación específica (más allá de los tipos de Moose) al atributo de Moose
Eche un vistazo al siguiente ejemplo que tiene dos atributos restringidos, uno debe ser 'm'
o 'f'
, el otro debe ser una fecha ISO válida. ¿Cuál es la mejor manera en Moose para especificar estas restricciones? Pensaría en la cláusula SQL CHECK
, pero AFAICS no hay check
palabra clave en Moose. Entonces usé trigger
, pero suena mal. Alguien tiene una mejor respuesta?
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;
Esto es lo que terminé usando:
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;
Esta es la versión 1.19 alces, en caso de que importa. Recibí la siguiente advertencia para la erróneasubtype as => 'Str', where => { ... }
sintaxis que introduje erróneamente: Calling subtype() with a simple list of parameters is deprecated
. Así que tuve que cambiarlo un poco según el fino manual.
** Respuesta: ** utilice sus propios tipos. –