use Template; use strict; my $template = Template->new; my $vars = { 'frames' => \&get_frames }; $template->process('test.tt', $vars); # this works display('test', $vars); # this doesn't sub get_frames { my @list; foreach my $l( qw/first second/ ) { my $fr = { 'one' => $l, 'two' => $l, }; push @list, $fr; } return @list; } sub display { # my $self = shift; my $file = shift; my %vars = @_; $template->process("$file.tt", \%vars); }