У меня есть два атрибута объекта, которые требуют дорогостоящих вычислений, поэтому я бы хотел, чтобы они были ленивыми. Они наиболее эффективно вычисляются вместе, поэтому я хотел бы рассчитать их одновременно. Предоставляет ли Moose способ сделать это?
Что бы я хотел, это нечто вроде "default" или "builder", но вместо того, чтобы возвращать значение по умолчанию, оно напрямую устанавливает атрибуты. Возвращаемое значение будет проигнорировано.
has max_things =>
is => 'rw',
isa => 'Int',
lazy => 1,
xxxxx => '_set_maxes';
has max_pairs =>
is => 'rw',
isa => 'Int',
lazy => 1,
xxxxx => '_set_maxes';
# Let just assume this is an expensive calculation or the max_*
# attributes are used rarely and a lot of objects are created.
sub _set_maxes {
my $self = shift;
if( $self->is_32_bit ) {
$self->max_things(2**31);
$self->max_pairs(12345 * 2);
}
else {
$self->max_thing(2**63);
$self->max_pairs(23456 * 2);
}
return;
}
ПРИМЕЧАНИЕ. Я мог бы написать свой собственный "читатель" или использовать "вокруг", но я бы предпочел сохранить его декларативным и позволить Moose выполнить эту работу. Я также мог бы создать новый объект только для хранения парных значений, но он кажется излишним только для двух значений.