use warnings; use strict; # Tests for the "Template Composition" doc examples. ############################################################################## package MyApp::UtilTemplates; use Template::Declare::Tags; use base 'Template::Declare'; template content => sub { my $self = shift; my @paras = @_; h1 { $self->get_title }; div { id is 'content'; p { $_ } for @paras; }; }; package MyApp::Templates; use Template::Declare::Tags; use base 'Template::Declare'; mix MyApp::UtilTemplates under '/util'; sub get_title { 'Kashmir' } template story => sub { my $self = shift; html { head { title { "My Site: " . $self->get_title }; }; body { show( 'util/content' => 'fist paragraph', 'second paragraph' ); }; }; }; ############################################################################## package main; use Test::More tests => 3; Template::Declare->init( dispatch_to => ['MyApp::Templates'] ); is +Template::Declare->show('story'), q{ My Site: Kashmir

Kashmir

fist paragraph

second paragraph

}, 'Should get mixed in template output'; ############################################################################## package MyApp::UI::Stuff; use Template::Declare::Tags; use base 'Template::Declare'; sub img_path { '/ui/css' } template sidebar => sub { my ($self, $thing) = @_; div { class is 'sidebar'; img { src is $self->img_path . '/sidebar.png' }; p { $_->content } for $thing->get_things; }; }; package MyApp::UI::Stuff::Politics; use Template::Declare::Tags; use base 'MyApp::UI::Stuff'; sub img_path { '/politics/ui/css' } package MyApp::Render; use Template::Declare::Tags; use base 'Template::Declare'; alias MyApp::UI::Stuff under '/stuff'; template page => sub { my ($self, $page) = @_; h1 { $page->title }; for my $thing ($page->get_things) { if ($thing->is('paragraph')) { p { $thing->content }; } elsif ($thing->is('sidebar')) { show( '/stuff/sidebar' => $thing ); } } }; package MyApp::Render::Politics; use Template::Declare::Tags; use base 'Template::Declare'; alias MyApp::UI::Stuff::Politics under '/politics'; template page => sub { my ($self, $page) = @_; h1 { $page->title }; for my $thing ($page->get_things) { if ($thing->is('paragraph')) { p { $thing->content }; } elsif ($thing->is('sidebar')) { show( '/politics/sidebar' => $thing ); } } }; package My::Thing; sub new { my $self = shift; bless {@_} => $self } sub title { shift->{title} }; sub content { shift->{content} }; sub get_things { @{ shift->{things} } }; sub is { shift->{is} eq shift }; package main; my $page = My::Thing->new( title => 'My page title', things => [ My::Thing->new( is => 'paragraph', content => 'Page paragraph' ), My::Thing->new( is => 'sidebar', things => [ My::Thing->new( content => 'Sidebar paragraph' ), My::Thing->new( content => 'Another paragraph' ), ], ) ], ); Template::Declare->init( dispatch_to => ['MyApp::Render'] ); is +Template::Declare->show( page => $page ), q{

My page title

Page paragraph

}, 'Should get page with default sidebar'; Template::Declare->init( dispatch_to => ['MyApp::Render::Politics'] ); is +Template::Declare->show( page => $page ), q{

My page title

Page paragraph

}, 'Should get page with politics sidebar';