/ / Ricostruire l'attributo pigramente costruito quando un attributo sottostante cambia in Moose - perl, alci, valutazione pigra, tratti

Ricostruire l'attributo pigramente costruito quando un attributo sottostante cambia in Moose - perl, alci, valutazione pigra, tratti

Ho una classe Moose con a lazy_build attributo. Il valore di quell'attributo è una funzione di un altro attributo (non pigro).

Supponiamo che qualcuno instanzia la classe con avalore 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!

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

Ora ho una soluzione in cui 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?

risposte:

9 per risposta № 1

La mia soluzione tipica:

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

Ad esempio, quando attr1 viene aggiornato, attr2 viene cancellato e verrà ricostruito al prossimo accesso. clear_attr2 viene gratis quando usi lazy_build. Finché usi i metodi di accesso, non hai bisogno di una bandiera "sporca".

Questo è un modello comune - una sorta di tratto per gestire attributi "derivati" sarebbe bello.