Search code examples
perlmoosetemplate-toolkit

Template Toolkit and lazy Moose attributes - how to make them behave?


If I declare lazy attribute in perl class using Moose, and the attribute is using builder:

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

then in Template::Toolkit template I'll try to use this attribute:

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

I'll get nothing. I have to call this attr manualy in perl script before processing the attribute with TT. Is there any way TT can initialize this attr by himself?


Solution

  • I am assuming you are passing the Moose object like this.

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

    The second paramater is assumed to be a hashref, not any kind of blessed object ( Moose or not ).

    So, the Moose object gets treated as a plain hash and does not have the 'colors' key until you populate it by calling the accessor outside Template Toolkit.

    You need to do something like this:

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

    And then in your template:

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

    Which should work as you expect it to.