The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#! perl
#
# Test for containers with object method values.
package Price;

use strict;
use warnings;

sub new {
    my $class = shift;
    my $id    = shift;
    my $self  = {};
    bless $self, $class;
    $self->id($id);
    $self->{_data} = {
        1 => { on_sale => 1, price => 35.99, sale_price => 24.97 },
        2 => { on_sale => 0, price => 24.99, sale_price => undef },
        3 => { on_sale => 1, price => 64.99, sale_price => 46.88 }
    };
    return $self;
}

sub id {
    my $self = shift;
    $self->{id} = shift if @_;
    return $self->{id};
}
sub on_sale { my $self = shift; $self->{_data}->{ $self->id }->{on_sale} }
sub price   { my $self = shift; $self->{_data}->{ $self->id }->{price} }

sub sale_price {
    my $self = shift;
    $self->{_data}->{ $self->id }->{sale_price};
}

package main;

use strict;
use warnings;

use Test::More tests => 2;
use Template::Flute;

my ( $spec, $html, $flute, $out );

$spec = <<'EOS';
<specification>
    <list name="items" iterator="items">
        <param name="itemid" />
        <param name="title" />
        <list name="prices" iterator="prices">
            <param name="price" />
            <param name="sale_price" class="sale-price" />
            <container name="not-on-sale" value="!on_sale" />
            <container name="on-sale" value="on_sale" />
        </list>
    </list>
</specification>
EOS

$html = <<'EOH';
<div class="items">
    <span class="itemid">109267</span> <span class="title">Joseph Phelps Insignia</span>
    <div class="prices">
        <div class="on-sale">
            <span class="strikethough price">$109.99</span>
            <span class="sale-price">$99.99</span> 
        </div>
        <div class="not-on-sale">
            <span class="price">$109.99</span>
        </div>
    </div>
</div>
EOH

my $items = [
    {   itemid => 540876,
        title  => q{Freemark Abbey Merlot 2012},
        prices => [ Price->new(1) ]
    },
    {   itemid => 555024,
        title  => q{Rancho Sisquoc Cabernet Sauvignon 2009},
        prices => [ Price->new(2) ]
    },
    {   itemid => 555518,
        title  => q{Paul Hobbs Russian River Valley Pinot Noir 2013},
        prices => [ Price->new(3) ]
    }
];

$flute = Template::Flute->new(
    template      => $html,
    specification => $spec,
    iterators     => { items => $items },
);

$out = $flute->process();

my @ct_arr   = $flute->template->containers;
my $ct_count = scalar @ct_arr;
ok( $ct_count == 2, 'Test for container count' )
    || diag "Wrong number of containers: $ct_count\n";

ok( $out
        =~ m{<div class="items"><span class="itemid">540876</span> <span class="title">Freemark Abbey Merlot 2012</span><div class="prices"><div class="on-sale"><span class="strikethough price">35.99</span><span class="sale-price">24.97</span></div></div></div><div class="items"><span class="itemid">555024</span> <span class="title">Rancho Sisquoc Cabernet Sauvignon 2009</span><div class="prices"><div class="not-on-sale"><span class="price">24.99</span></div></div></div><div class="items"><span class="itemid">555518</span> <span class="title">Paul Hobbs Russian River Valley Pinot Noir 2013</span><div class="prices"><div class="on-sale"><span class="strikethough price">64.99</span><span class="sale-price">46.88</span></div></div></div>},
    q{container test via method}
);