Вы можете использовать для этого либо BUILD
, либо BUILDARGS
. Трудно сказать, что было бы лучше, не зная больше о том, что вы пытаетесь сделать, но я бы предположил, что BUILD
будет лучшим выбором.
sub BUILD {
my $self = shift;
my $args = shift;
my $ds = $args->{ds} or confess "Argument (ds) is required";
$self->some_attr($ds->{...});
$self->other_attr($ds->{foo}[3]);
...
} # end BUILD
Если вы хотите, чтобы Moose проверил тип и удостоверился в его наличии, вы должны сделать его атрибутом. Но вы можете очистить его в методе BUILD
после его использования.
has 'ds' => (
is => 'ro',
isa => 'SomeType',
required => 1,
clearer => '_clear_ds',
);
sub BUILD {
my $self = shift;
my $args = shift;
my $ds = $self->ds;
$self->_clear_ds;
$self->some_attr($ds->{...});
$self->other_attr($ds->{foo}[3]);
...
} # end BUILD
Вы можете назвать метод считывателя как-нибудь еще (например, _ds
), если хотите.