Я создаю класс, который будет содержать список IP-адресов в виде объектов Net :: IP.
Я обернул объект Net :: IP подтипом (IPAddress) и определилприведение строки к IP-адресу.Затем я добавил атрибут в класс ip_list с типом ArrayRef [IPAddress] и делегировал методу push признака Array .
use MooseX::Declare;
use Moose::Util::TypeConstraints;
use Net::IP;
subtype 'IPAddress'
=> as 'Object'
=> where { $_->isa('Net::IP') };
coerce 'IPAddress'
=> from 'Str'
=> via { Net::IP->new( $_ ) };
class IPs {
has 'ip_list' => ( traits => ['Array'],
isa => 'ArrayRef[IPAddress]',
is => 'rw',
coerce => 1,
auto_deref => 1,
default => sub { [] },
handles => {
add_ip => 'push'
}
);
}
Однако, если я пытаюсь вызвать делегированный метод следующим образом:
my $o = IPs->new();
$o->add_ip( '192.168.0.1' );
Я получаю ошибку «Значение SCALAR (0x8017e8) не прошло ограничение типа контейнера 'IPAddress' в ..."
Таким образом, очевидно, что параметр add_ip не принуждается.
Можно ли сделать то, что я пытаюсь, или я должен сделать все это вручную?Я просмотрел руководства по Moose, но не видел ничего, что указывало бы в любом случае, но я, вероятно, что-то упустил.