2012-06-16 15 views
6

Si me declaran atributo en la clase perezosa Perl usando alces, y el atributo es el uso de constructor:Template Toolkit y perezosos atributos de Moose: ¿cómo hacer que se comporten?

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

a continuación en la plantilla Plantilla :: Toolkit Voy a tratar de utilizar este atributo:

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

No obtendré nada. Tengo que llamar a este attr manualmente en script de Perl antes de procesar el atributo con TT. ¿Hay alguna manera de que TT pueda inicializar este atributo por sí mismo?

Respuesta

13

Supongo que está pasando el objeto Moose de esta manera.

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

El segundo parámetro de se supone que es un hashref, no cualquier tipo de objeto bendito (Moose o no).

Por lo tanto, el objeto Moose se trata como un hash simple y no tiene la tecla 'colors' hasta que lo rellene llamando al acceso externo a Template Toolkit.

que tiene que hacer algo como esto:

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

Y luego en su plantilla:

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

que deberían funcionar como se espera que lo haga.

+1

¡Buena conjetura del error real del OP! Apuesto a que has sido mordido por esto antes :) – ikegami

+0

@ikegami No, pero he pasado demasiado tiempo trabajando con Template Toolkit y necesitando estudiar cómo funciona el alijo. – Dre

+1

Sí, el esquema real era un poco más complejo, pero en general su forma de trabajar funcionó para mí, ¡gracias! – Sly

Cuestiones relacionadas