The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Template::Teeny::Stash;

use Moose;
use Moose::Util::TypeConstraints;

has vars => (is => 'rw', isa => 'HashRef', default => sub { {} });
has _sections => (is => 'rw', isa => 'HashRef[ArrayRef]', default => sub { {} });

sub BUILDARGS { return { vars => ($_[1]||{}) }; }

sub sections { @{ $_[0]->_sections->{$_[1]} || [] }; }
sub add_section {
    my ($self,$sec,@stashes) = @_;
    $self->_sections->{$sec} ||= [];
    push @{ $self->_sections->{$sec} }, (@stashes ? @stashes : undef); 
}

# XXX - add ability to deal with filters here
sub get { 
    # All values return are always strings
    "" . ( $_[0]->vars->{$_[1]} || '' ); 
}

__PACKAGE__->meta->make_immutable();
1;

__END__

=head1 NAME

Template::Teeny::Stash - Object containing stashed variables

=head1 SYNOPSIS

    my $stash = Template::Teeny::Stash->new({
        a => 1,
        ...
    });

    $stash->add_section('section_foo', $other_stash);

Objects of this class store the variables and sections for use with templates.

=head1 METHODS

=head2 new

Basic constructor

=head2 get

 # TODO Add filter support

  $stash->get('variable1');

This returns the variable of the supplied name in this stash.

=head2 add_section

  $stash->add_section('topsection', $other_stash);

This adds a stash to the named section.

=head2 sections

  $stash->sections('somesection');

This returns the stashes that have been added to the named section.

=head2 vars

  $stash->vars();

This is an accessor for the variables associated with this stash.

=head2 BUILDARGS

This is a moose thang.

=cut