Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 460
Sly Avatar asked Jun 16 '12 21:06

Sly


1 Answers

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.

like image 134
Dre Avatar answered Oct 18 '22 08:10

Dre