Обновление
Код, который я разместил в моем первоначальном вопросе, иллюстрировал, как модификатор метода работает или не работает.Это не обязательно было иллюстрацией описания проблемы, которое я дал.Этот код должен быть.Это работает, но содержит взлом в триггере, который я использовал, чтобы кодировать требование отслеживания всех обновлений и действия на них в зависимости от значения, предоставленного сеттеру.делать работу.Обилие функций и возможностей не всегда делает вещи проще.По крайней мере, когда вы пытаетесь не изобретать какие-либо колеса и повторно использовать то, что можно использовать повторно.
Исходный вопрос
Похоже, модификатор метода around
не вызывается как часть построения объекта(при звонке new
).Тестовый пример здесь:
package Bla;
use Moose;
has 'eins', is => 'rw', isa => 'Int';
has 'zwei', is => 'rw', isa => 'Num';
around [qw/ eins zwei /] => sub {
my $orig = shift;
my $self = shift;
return $self->$orig unless @_;
my $val = shift;
if ( $val == int $val ) {
return $self->$orig( $val );
}
else {
return $self->$orig( 1 );
warn "replaced $val by 1";
}
};
package main;
use Test::More;
use Test::Exception;
dies_ok { Bla->new( eins => 33.33 ) } 'dies because of Int type constraint';
my $bla = Bla->new( zwei => 22.22 );
is $bla->zwei, 22.22, 'around has not been called';
done_testing;
Позвольте мне объяснить, чего я хочу достичь.Есть класс, который имеет quantity
и price
(и еще несколько состояний).Когда приходит количество (через new
или через сеттер, мне все равно), я хочу убедиться, что оно заканчивается как целое число (отсюда и ограничение).Если это не целое число, я хочу заменить его просто на 1
и сделать некоторые другие обновления объекта, например, сохранить исходное количество и умножить цену на исходное количество.И для конструктора, и для сеттера.
Что мне делать?Укажите подпрограмму, которая выполняет эту работу, и вызовите ее из around BUILDARGS
и around quantity
?