2012-06-16 12 views
6

Se dichiaro attributo pigro in classe perl con Moose, e l'attributo sta usando costruttore:Attributi Template Toolkit e Lazy Moose - come farli comportare?

has 'colors' => (
    is => 'rw', 
    isa => 'ArrayRef', 
    lazy => 1, 
    builder => '_build_colors', 
); 

poi nel template :: Toolkit Cercherò di utilizzare questo attributo:

[% FOREACH color IN colors %] 
... 
[% END %] 

Non otterrò niente. Devo chiamare questo attr manuale in script perl prima di elaborare l'attributo con TT. C'è un modo in cui TT può inizializzare questo attr da solo?

risposta

13

Suppongo che tu stia passando l'oggetto Moose in questo modo.

$template->process('some.tt', $moose_object, ...); 

Il secondo paramater viene considerata una rif_hash, alcun tipo di oggetto benedetto (Moose o meno).

Quindi, l'oggetto Moose viene trattato come un semplice hash e non ha il tasto "colori" finché non viene compilato chiamando l'accessor all'esterno di Template Toolkit.

Hai bisogno di fare qualcosa di simile:

$template->process('some.tt', { obj => $moose_object }, ...); 

E poi nel modello:

[% FOREACH color IN obj.colors %] 
... 
[% END %] 

che dovrebbe funzionare come ci si aspetta a.

+1

Buona ipotesi dell'errore effettivo dell'OP! Scommetto che sei stato morso da questo prima :) – ikegami

+0

@ikegami No, ma ho trascorso troppo tempo lavorando di recente con Template Toolkit e ho bisogno di studiare come funziona lo stash. – Dre

+1

Sì, lo schema attuale era un po 'più complesso, ma in generale il tuo modo di lavorare ha funzionato per me, grazie! – Sly

Problemi correlati