Template::Iterator::AlzaboWrapperCursor - Turns a Class::AlzaboWrapper::Cursor object into a TT2 iterator


Template-Iterator-AlzaboWrapperCursor documentation Contained in the Template-Iterator-AlzaboWrapperCursor distribution.

Index


Code Index:

NAME

Top

Template::Iterator::AlzaboWrapperCursor - Turns a Class::AlzaboWrapper::Cursor object into a TT2 iterator

SYNOPSIS

Top

  my $users =
      Template::Iterator::AlzaboWrapperCursor->new($cursor);
  # pass $users to a template

  my $users_with_pages =
      Template::Iterator::AlzaboWrapperCursor->new($users_with_pages);

In a template:

  [% FOREACH user = users %]
    Name: [% user.name %]<br />
  [% END %]

  [% FOREACH user_with_page = users_with_pages %]
    [% user_with_page.user.name %]: [% user_with_page.page.title %]
  [% END %]

DESCRIPTION

Top

This module allows a Class::AlzaboWrapper::Cursor object to be used as a TT2 iterator.

USAGE

Top

For a cursor which returns one object at a time, the iterator simply returns one object per iteration. When the cursor returns multiple objects, the iterator returns a hash reference where the keys are the table name of the object's class in lower-case, with camel-casing turned into underscores. The values of the hash are the objects.

So if the cursor returns Foo::User and Foo::Page objects, the keys are "user" and "page".

METHODS

Top

This class provides the following methods:

new($cursor)

This method accepts a Class::AlzaboWrapper::Cursor object and returns an iterator suitable for use in TT2 templates.

WISHLIST

Top

I wish that TT2 allowed multiple assignment in FOREACH loops so we could just do this:

  [% FOREACH user, page = users_with_pages %]

That's so much cleaner.

AUTHOR

Top

Dave Rolsky, <autarch@urth.org>

Initially written for Socialtext, Inc.

BUGS

Top

Please report any bugs or feature requests to bug-template-iterator-alzabowrappercursor@rt.cpan.org, or through the web interface at http://rt.cpan.org. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

COPYRIGHT & LICENSE

Top


Template-Iterator-AlzaboWrapperCursor documentation Contained in the Template-Iterator-AlzaboWrapperCursor distribution.

package Template::Iterator::AlzaboWrapperCursor;

use strict;
use warnings;

use vars qw($VERSION);

$VERSION = 0.01;

use base qw( Template::Iterator );
use Template::Constants;


# The majority of this code is copied and slightly altered from
# Template::Plugin::DBI::Iterator, in Template/Plugin/DBI.pm

sub new {
    my $class = shift;
    my $cursor = shift;

    return bless {
        cursor  => $cursor,
        # Template::Iterator expects these fields to exist, but we
        # should not need to use them
        SIZE    => undef,
        MAX     => undef,
    }, $class;
}

sub get_first {
    my $self = shift;
    $self->{_STARTED} = 1;

    @$self{ qw(  PREV   ITEM FIRST LAST COUNT INDEX ) }
            = ( undef, undef,    2,   0,    0,   -1 );

    # get the first row
    $self->_next();

    return $self->get_next();
}

sub get_next {
    my $self = shift;

    $self->{INDEX}++;
    $self->{COUNT}++;

    $self->{FIRST}-- if $self->{FIRST};

    my $row = $self->{NEXT};
    return ( undef, Template::Constants::STATUS_DONE )
	unless $row;

    $self->{PREV} = $self->{ITEM};

    $self->_next();

    $self->{ITEM} = $row;

    return ( $row, Template::Constants::STATUS_OK );
}

sub get_all {
    my $self = shift;

    $self->{ LAST } = 1;
    $self->{ NEXT } = undef;

    return ( [ $_[0]->{cursor}->all ], Template::Constants::STATUS_OK );
}

sub _next {
    my $self = shift;

    my %rows = $self->{cursor}->next_as_hash;

    unless ( keys %rows ) {
	$self->{LAST} = 1;
	$self->{NEXT} = undef;

	return;
    }

    if ( keys %rows == 1 ) {
        $self->{NEXT} = (values %rows)[0];
    }
    else {
        for my $k ( keys %rows ) {
            ( my $lc_key = $k ) =~ s/(^|.)([A-Z])/$1 ? "$1\L_$2" : "\L$2"/ge;
            $rows{$lc_key} = delete $rows{$k};
        }

        $self->{NEXT} = \%rows;
    }

    return;
}


1;

__END__