Как определить подпрограмму объекта Moose после ее инициализации?
Я пишу объектный модуль с использованием Moose и планирую сериализовать (nstore
) созданные объекты.
Изучите следующий (упрощенный!) Пример:
package MyObj 0.001;
use Moose;
use namespace::autoclean;
has 'size' => (
is => 'ro',
isa => 'Int',
required => 1,
);
sub some_sub {
my ($self, @more) = @_;
if ($self->size() < 100) # do something;
elsif (($self->size() < 500)) # do something else;
elsif (($self->size() < 7500)) # do something else;
# ...
}
1;
some_sub
действует по-разному в зависимости от size
.Поскольку size
доступен только для чтения, он остается постоянным после инициализации объекта.
Так что, предполагая, что я вызываю some_sub
zillion раз, очень жаль, что мне нужно пройти через все if
s каждый раз.
Лучше сделать это один раз после инициализации объекта, затем установить some_sub
как более простую функцию без if
s вообще.
Но... как я могу это сделать?
ОБНОВЛЕНИЕ
Возможно, мне следует добавить атрибут lazy
типа subref, который будет содержать ссылку на выбранную подпрограмму.some_sub
тогда просто позвонит $self->chosen_sub->(@_)
.Что ты думаешь?