Skip to content

Commit 132fea6

Browse files
committed
Merge branch 'feature/change-tt-base-class'
2 parents 126be70 + 12b9963 commit 132fea6

File tree

5 files changed

+75
-2
lines changed

5 files changed

+75
-2
lines changed

Changes

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
* None
77

88
[ ENHANCEMENTS ]
9-
* None
9+
* GH #1723: Enable use of a different Template Toolkit base class
10+
(Andy Beverley)
1011

1112
[ DOCUMENTATION ]
1213
* None

lib/Dancer2/Template/TemplateToolkit.pm

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ use Dancer2::FileUtils qw<path>;
99
use Scalar::Util ();
1010
use Template;
1111

12+
# Override to use a different Template::Toolkit base class
13+
has 'template_class' => ( is => 'ro', default => 'Template' );
14+
1215
with 'Dancer2::Core::Role::Template';
1316

1417
has '+engine' => ( isa => InstanceOf ['Template'], );
@@ -37,7 +40,7 @@ sub _build_engine {
3740
sub { [ $ttt->views ] },
3841
];
3942

40-
my $tt = Template->new(%tt_config);
43+
my $tt = $self->template_class->new(%tt_config);
4144
$Template::Stash::PRIVATE = undef if $self->config->{show_private_variables};
4245
return $tt;
4346
}
@@ -190,6 +193,22 @@ PARSER (L<Template::Parser>) and GRAMMAR (L<Template::Grammar>). If you intend t
190193
several of these components in your app, it is suggested to create an app-specific subclass
191194
that handles all of them at the same time.
192195
196+
=head2 Custom Template::Toolkit class
197+
198+
When subclassing this module it is possible to use a different
199+
Template::Toolkit class (for example if you have also subclassed that). To do
200+
that simply define a different C<template_class> property:
201+
202+
package Dancer2::Template::TemplateToolkit::FooBar;
203+
204+
use Moo;
205+
206+
extends 'Dancer2::Template::TemplateToolkit';
207+
208+
has '+template_class' => ( default => 'TemplateFooBar' );
209+
210+
1;
211+
193212
=head2 Template Caching
194213
195214
L<Template>::Tookit templates can be cached by adding the C<COMPILE_EXT> property to your
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package Dancer2::Template::TemplateToolkitFoo;
2+
3+
# Custom Template::Toolkit template engine that uses a custom Template class
4+
5+
use strict;
6+
use warnings;
7+
8+
use Moo;
9+
use TemplateFoo;
10+
11+
extends 'Dancer2::Template::TemplateToolkit';
12+
13+
has '+template_class' => ( default => 'TemplateFoo' );
14+
15+
1;

t/lib/TemplateFoo.pm

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package TemplateFoo;
2+
3+
# Custom Template::Toolkit class
4+
5+
use base 'Template';
6+
7+
sub process
8+
{ my ($self, $template, $vars, $outstream, @opts) = @_;
9+
$$outstream = "Custom Render Template";
10+
1;
11+
}
12+
13+
1;

t/template.t

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,13 @@ use HTTP::Request::Common;
88
use File::Spec;
99
use File::Basename 'dirname';
1010

11+
use lib 't/lib';
12+
1113
eval { require Template; Template->import(); 1 }
1214
or plan skip_all => 'Template::Toolkit probably missing.';
1315

1416
use_ok('Dancer2::Template::TemplateToolkit');
17+
use_ok('Dancer2::Template::TemplateToolkitFoo');
1518

1619
my $views =
1720
File::Spec->rel2abs( File::Spec->catfile( dirname(__FILE__), 'views' ) );
@@ -109,6 +112,28 @@ content added in after_layout_render";
109112
is $res->content, $result, '[GET /global] Correct content with template hooks';
110113
};
111114

115+
# Test that a custom class can be used for Template::Toolkit
116+
my $tt_custom = Dancer2::Template::TemplateToolkitFoo->new;
117+
118+
isa_ok $tt_custom, 'Dancer2::Template::TemplateToolkit';
119+
isa_ok $tt_custom, 'Dancer2::Template::TemplateToolkitFoo';
120+
121+
{
122+
package CustomFoo;
123+
use Dancer2;
124+
125+
Dancer2->runner->apps->[1]->set_template_engine($tt_custom);
126+
127+
get '/' => sub { template 'index' };
128+
}
129+
130+
subtest 'custom template render' => sub {
131+
132+
my $test = Plack::Test->create( CustomFoo->to_app );
133+
my $res = $test->request( GET '/' );
134+
is $res->content, 'Custom Render Template', 'Custom Render Template';
135+
};
136+
112137
{
113138

114139
package Foo;

0 commit comments

Comments
 (0)