Восстановление ленивого атрибута при изменении базового атрибута в Moose - PullRequest
5 голосов
/ 25 апреля 2010

У меня есть класс Moose с атрибутом lazy_build. Значение этого атрибута является функцией другого (не ленивого) атрибута.

Предположим, кто-то создает экземпляр класса со значением 42 для обязательного атрибута. Затем они запрашивают ленивый атрибут, который рассчитывается как функция от 42. Затем у них есть смелость изменить первый атрибут!

Ленивый уже построен, поэтому сборщик больше не будет вызываться, а атрибут lazy устарел.

Теперь у меня есть решение, в котором я сохраняю флаг «грязный» для обязательного атрибута, а средство доступа для ленивого проверяет флаг «грязный» и восстанавливает его при необходимости.

Однако, это похоже на большую работу. Есть ли способ справиться с этим в Moose, например используя черты?

1 Ответ

9 голосов
/ 25 апреля 2010

Мое типичное решение:

has 'attr1' => (
    ...
    trigger => \&clear_attr2, 
);

т.е. когда attr1 обновляется, attr2 очищается и будет восстановлен при следующем обращении к нему. clear_attr2 предоставляется бесплатно при использовании lazy_build. Пока вы используете методы доступа, вам не нужен «грязный» флаг.

Это обычная модель - неплохо было бы использовать некоторую черту для обработки «производных» атрибутов.

...