Я получил много исключений от QA из-за неполных данных, передаваемых в мои конструкторы Moose. Имя атрибута присутствует в аргументах конструктора, но его значение равно undef
.
Это факт из жизни многих приложений-сценариев, что вещи просто undef
. И часто это прекрасно. Вам не нужно раздражающее предупреждение от прагмы warnings
(поэтому вы делаете no warnings 'uninitialized'
), и вы, конечно же, не хотите, чтобы ваш код умер из-за одного маленького значения , скажем, номер дома - undef
.
Итак, без лишних слов, я хочу, чтобы мои конструкторы Moose вели себя как обычный Perl (то есть без использования предупреждений «неинициализировано»
), то есть для преобразования undef
в 0
или в пустую строку по мере необходимости. Попытка, показанная в этом примере, не работает для случая, когда имя атрибута присутствует, но имеет значение undef
. Я мог бы подумать об использовании BUILDARGS
для достижения того, что я хочу. Но существует ли декларативный способ в обычном Moose без обращения к MooseX :: UndefTolerant (который, к сожалению, я не могу использовать, поскольку он не установлен)?
package AAA;
use Moose;
has 'hu', is => 'ro', isa => 'Str';
has 'ba', is => 'ro', isa => 'Int';
no Moose; __PACKAGE__->meta->make_immutable;
package BBB;
use Moose; extends 'AAA';
has '+hu', default => ''; # don't want to die on undef
has '+ba', default => 0; # idem
no Moose; __PACKAGE__->meta->make_immutable;
package main;
use Test::More;
use Test::Exception;
# Those AAAs should die ...
throws_ok { AAA->new( hu => undef ) }
qr/Validation failed for 'Str' with value undef/;
throws_ok { AAA->new( ba => undef ) }
qr/Validation failed for 'Int' with value undef/;
# .. but these BBBs should live:
lives_ok { BBB->new( hu => undef ) } 'hu supplied as undef';
lives_ok { BBB->new( ba => undef ) } 'ba supplied as undef';
done_testing;