#!/usr/bin/perl use strict; use Foo; use Template; my $template = Template->new(); my @data = ( 1, 2, 3 ); $template->process( \*DATA, { object => Foo->new, data => \@data }) || die "Cannot process: ", $template->error(); __DATA__ [% FOREACH d = data %] The datum is [% d %] and the computed result is '[% object.compute( d ) %]' [% END %] #### package Foo; # save as Foo.pm sub new { my ( $class, %params ) = @_; return bless( \%params, $class ); } sub compute { my ( $self, $data ) = @_; return "compute() called with: $data"; } 1; #### $ perl test_tt_method.pl The datum is 1 and the computed result is 'compute() called with: 1' The datum is 2 and the computed result is 'compute() called with: 2' The datum is 3 and the computed result is 'compute() called with: 3'