Template::Iterator(3pm)
NAME
Template::Iterator - Data iterator used by the FOREACH directive
SYNOPSIS
my $iter = Template::Iterator->new(\@data, \%options);
DESCRIPTION
The "Template::Iterator" module defines a generic data iterator for use
by the "FOREACH" directive.
It may be used as the base class for custom iterators.
PUBLIC METHODS
- new($data)
- Constructor method. A reference to a list of values is passed as the
first parameter. Subsequent calls to get_first() and get_next() calls will return each element from the list.
my $iter = Template::Iterator->new([ 'foo', 'bar', 'baz' ]); - The constructor will also accept a reference to a hash array and will
expand it into a list in which each entry is a hash array containing a '"key"' and '"value"' item, sorted according to the hash keys.
my $iter = Template::Iterator->new({foo => 'Foo Item',
bar => 'Bar Item',}); - This is equivalent to:
my $iter = Template::Iterator->new([{ key => 'bar', value => 'Bar Item' },
{ key => 'foo', value => 'Foo Item' },]); - When passed a single item which is not an array reference, the
constructor will automatically create a list containing that single
item.
my $iter = Template::Iterator->new('foo'); - This is equivalent to:
my $iter = Template::Iterator->new([ 'foo' ]); - Note that a single item which is an object based on a blessed ARRAY
references will NOT be treated as an array and will be folded into a
list containing that one object reference.
my $list = bless [ 'foo', 'bar' ], 'MyListClass';
my $iter = Template::Iterator->new($list); - equivalent to:
my $iter = Template::Iterator->new([ $list ]); - If the object provides an "as_list()" method then the
Template::Iterator constructor will call that method to return the list of data. For example:
package MyListObject;sub new {my $class = shift;
bless [ @_ ], $class;}package main;my $list = MyListObject->new('foo', 'bar');
my $iter = Template::Iterator->new($list); - This is then functionally equivalent to:
my $iter = Template::Iterator->new([ $list ]); - The iterator will return only one item, a reference to the
"MyListObject" object, $list. - By adding an "as_list()" method to the "MyListObject" class, we can
force the "Template::Iterator" constructor to treat the object as a
list and use the data contained within.
package MyListObject;...sub as_list {my $self = shift;
return $self;}package main;my $list = MyListObject->new('foo', 'bar');
my $iter = Template::Iterator->new($list); - The iterator will now return the two items, '"foo"' and '"bar"', which the "MyObjectList" encapsulates.
- get_first()
- Returns a "($value, $error)" pair for the first item in the iterator
set. The $error returned may be zero or undefined to indicate a valid datum was successfully returned. Returns an error of "STATUS_DONE" if the list is empty. - get_next()
- Returns a "($value, $error)" pair for the next item in the iterator
set. Returns an error of "STATUS_DONE" if all items in the list have
been visited. - get_all()
- Returns a "(\@values, $error)" pair for all remaining items in the
iterator set. Returns an error of "STATUS_DONE" if all items in the
list have been visited. - size()
- Returns the size of the data set or undef if unknown.
- max()
- Returns the maximum index number (i.e. the index of the last element)
which is equivalent to size() - 1. - index()
- Returns the current index number which is in the range 0 to max().
- count()
- Returns the current iteration count in the range 1 to size(). This is equivalent to index() + 1.
- first()
- Returns a boolean value to indicate if the iterator is currently on the first iteration of the set.
- last()
- Returns a boolean value to indicate if the iterator is currently on the last iteration of the set.
- prev()
- Returns the previous item in the data set, or "undef" if the iterator
is on the first item. - next()
- Returns the next item in the data set or "undef" if the iterator is on the last item.
- parity()
- Returns the text string "even" or "odd" to indicate the parity of the
current iteration count (starting at 1). This is typically used to
create striped zebra tables.
<table>
[% FOREACH name IN ['Arthur', 'Ford', 'Trillian'] -%]<tr class="[% loop.parity %]"><td>[% name %]</td></tr>[% END %]
</table> - This will produce the following output:
<table><tr class="odd"><td>Arthur</td></tr>
<tr class="even"><td>Ford</td></tr>
<tr class="odd"><td>Trillian</td></tr></table> - You can then style the "tr.odd" and "tr.even" elements using CSS:
tr.odd td {background-color: black;
color: white;}tr.even td {background-color: white;
color: black;} - odd()
- Returns a boolean (0/1) value to indicate if the current iterator count
(starting at 1) is an odd number. In other words, this will return a
true value for the first iterator, the third, fifth, and so on. - even()
- Returns a boolean (0/1) value to indicate if the current iterator count
(starting at 1) is an even number. In other words, this will return a
true value for the second iteration, the fourth, sixth, and so on.
AUTHOR
Andy Wardley <abw@wardley.org> <http://wardley.org/>
COPYRIGHT
Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.
This module is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
SEE ALSO
- Template