2013-05-24 4 views

ответ

6

Если вы сделаете это:

has 'attr' => (
    is => 'rw', 
    isa => 'Int', 
    lazy => 1, 
    default => 10, 
    clearer => '_clear_attr', 
); 

, то вы можете сделать:

my $obj = Class->new; 
print $obj->attr; # 10 
$obj->attr(5); 
print $obj->attr; # 5 
$obj->_clear_attr; 
print $obj->attr; # 10 

Сочетание lazy и clearer важно здесь.

+0

Ничего себе. И я думал, что «default» и «lazy» не могут быть объединены. Это недавнее улучшение «Муса»? – innaM

+0

@innaM нет, он работает еще, насколько я помню. Чаще всего использовать 'lazy' с' builder' (исходя из предположения, что строитель делает что-то дорогое или зависит от других данных), но 'default' - это очень простой строитель :) – hobbs

+0

Btw, clearer также работает если 'attr' = = 'ro. Это полезно, если вы ленивы загружаете значение из базы данных, и знаете, что указанное значение из указанной базы данных изменилось. Просто attr -> _ clear_attr, и в следующий раз, когда «attr» будет доступен, Moose повторно загрузит обновленное значение из базы данных. – yahermann

Смежные вопросы