Sly
Sly

Reputation: 415

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?

Upvotes: 6

Views: 453

Answers (1)

Dre
Dre

Reputation: 4329

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.

Upvotes: 13

Related Questions