2010-04-25 5 views
5

Ho una classe Moose con un attributo lazy_build. Il valore di quell'attributo è una funzione di un altro attributo (non pigro).Ricostruzione di un attributo ponderato quando un attributo sottostante cambia in Alce

Supponiamo che qualcuno istanzia la classe con un valore di 42 per l'attributo richiesto. Quindi richiedono l'attributo lazy, che viene calcolato come una funzione di 42. Quindi, hanno il coraggio di cambiare il primo attributo!

Il server pigro è già stato creato, quindi il builder non verrà richiamato e l'attributo lazy non è aggiornato.

Ho una soluzione ora dove mantengo un flag "dirty" sull'attributo richiesto, e un accessor sul pigro controlla il flag dirty e lo ricostruisce se necessario.

Tuttavia, questo sembra un sacco di lavoro. C'è un modo per gestirlo all'interno di Moose, ad es. usando i tratti?

+0

È possibile controllare le risposte di quando ho posto la stessa domanda: [Scadenza dei risultati memorizzati nella cache dei calcoli quando i valori degli attributi cambiano] (http://stackoverflow.com/questions/1775572/moose-expiring-cached-results -of-calcoli-quando-attributo-valori-cambia "Scadenza dei risultati nella cache dei calcoli quando i valori degli attributi cambiano") – clscott

risposta

9

mia soluzione tipica:

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

vale a dire quando attr1 viene aggiornato, attr2 viene cancellata e verrà ricostruito quando è successivo accesso. clear_attr2 viene fornito gratuitamente quando si utilizza lazy_build. Finché usi i metodi accessor, non hai bisogno di un flag 'dirty'.

Questo è uno schema comune: una sorta di tratto per gestire gli attributi "derivati" sarebbe bello.

+1

Perfetto. Mi piace davvero questa soluzione. Stavo andando nella stessa direzione facendo un modificatore 'dopo' su' set_attr1', ma il trigger è ancora più semplice. Grazie – friedo

Problemi correlati