2010-04-25 14 views
5

Tengo una clase Moose con un atributo lazy_build. El valor de ese atributo es una función de otro atributo (no perezoso).Reconstrucción de atributo de construcción lenta cuando cambia un atributo subyacente en Moose

Supongamos que alguien instancia la clase con un valor de 42 para el atributo requerido. Luego solicitan el atributo perezoso, que se calcula como una función de 42. ¡Entonces tienen el valor de cambiar el primer atributo!

El perezoso ya se ha creado, por lo que no se volverá a llamar al generador y el atributo vago ahora no está actualizado.

Tengo una solución ahora donde mantengo un indicador "sucio" en el atributo requerido, y un descriptor de acceso en el flojo comprueba el indicador sucio y lo reconstruye si es necesario.

Sin embargo, esto parece mucho trabajo. ¿Hay alguna manera de manejar esto dentro de Moose, p. usando rasgos?

+0

Es posible que desee verificar las respuestas de cuando hice la misma pregunta: [Caducidad de los resultados en caché de los cálculos cuando cambian los valores de los atributos] (http://stackoverflow.com/questions/1775572/moose-expiring-cached-results -f-calculations-when-attribute-values-change "Caducar los resultados en caché de los cálculos cuando cambian los valores de los atributos") – clscott

Respuesta

9

Mi solución típica:

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

es decir, cuando se actualiza attr1, attr2 se borra y será reconstruido cuando se accede al lado. clear_attr2 viene gratis cuando usa lazy_build. Siempre que use los métodos de acceso, no necesita un indicador "sucio".

Este es un patrón común: algún tipo de rasgo para manejar los atributos 'derivados' sería bueno.

+1

Perfecto. Realmente me gusta esta solución. Estaba yendo en la misma dirección haciendo un modificador 'after' en' set_attr1', pero el disparador es aún más fácil. Gracias – friedo

Cuestiones relacionadas