Вы можете использовать модификатор метода before
(перехват метода), чтобы заставить атрибуты строить в определенном порядке:
package Z;
use Moose;
has config => (
isa => 'HashRef',
is => 'ro',
lazy => 1,
default => sub { print STDERR "called 'config'\n"; return { a => 'b' }; },
);
has logger => (
isa => 'Str',
is => 'ro',
lazy => 1,
default => sub { print STDERR "called 'logger'\n"; return 'Fred'; }
);
before 'logger' => sub {
my $self = shift;
print STDERR "called before 'logger'\n";
die "No logger!: $!\n" if !defined $self->config;
return;
};
package A;
my $z = Z->new();
print "logger: ", $z->logger, "\n";
print "config{a}: ", $z->config->{a}, "\n";
Вывод этого примера кода, показывающий, что config
создается до logger
с помощью модификатора метода before
:
called before 'logger'
called 'config'
called 'logger'
logger: Fred
config{a}: b