use Template;
use Template::Timer;
use MRO::Compat;
-use Scalar::Util qw/blessed/;
+use Scalar::Util qw/blessed weaken/;
-our $VERSION = '0.34';
+our $VERSION = '0.36';
+$VERSION = eval $VERSION;
__PACKAGE__->mk_accessors('template');
+__PACKAGE__->mk_accessors('expose_methods');
__PACKAGE__->mk_accessors('include_path');
*paths = \&include_path;
my $config = {
EVAL_PERL => 0,
TEMPLATE_EXTENSION => '',
+ CLASS => 'Template',
%{ $class->config },
%{$arguments},
};
# Set base include paths. Local'd in render if needed
$self->include_path($config->{INCLUDE_PATH});
+ $self->expose_methods($config->{expose_methods});
$self->config($config);
# Creation of template outside of call to new so that we can pass [ $self ]
}
$self->{template} =
- Template->new($config) || do {
- my $error = Template->error();
+ $config->{CLASS}->new($config) || do {
+ my $error = $config->{CLASS}->error();
$c->log->error($error);
$c->error($error);
return undef;
name => $c->config->{name}
);
- if ($self->config->{expose_methods}) {
+ if ($self->expose_methods) {
my $meta = $self->meta;
- foreach my $method_name (@{$self->config->{expose_methods}}) {
- my $method = $meta->get_method( $method_name );
+ foreach my $method_name (@{$self->expose_methods}) {
+ my $method = $meta->find_method_by_name( $method_name );
unless ($method) {
Catalyst::Exception->throw( "$method_name not found in TT view" );
}
my $method_body = $method->body;
+ my $weak_ctx = $c;
+ weaken $weak_ctx;
my $sub = sub {
- $self->$method_body($c, @_);
+ $self->$method_body($weak_ctx, @_);
};
$vars{$method_name} = $sub;
}
For example:
- expose_methods => [qw/uri_for_static/],
+ expose_methods => [qw/uri_for_css/],
...
This can prove useful when you want to use the additional_template_paths hack
in your own provider, or if you need to use Template::Provider::Encoding
+=head2 C<CLASS>
+
+Allows you to specify a custom class to use as the template class instead of
+L<Template>.
+
+ package MyApp::View::Web;
+
+ use strict;
+ use base 'Catalyst::View::TT';
+
+ use Template::AutoFilter;
+
+ __PACKAGE__->config({
+ CLASS => 'Template::AutoFilter',
+ });
+
+This is useful if you want to use your own subclasses of L<Template>, so you
+can, for example, prevent XSS by automatically filtering all output through
+C<| html>.
+
=head2 HELPERS
The L<Catalyst::Helper::View::TT> and
Andy Wardley, C<abw@cpan.org>
+Luke Saunders, C<luke.saunders@gmail.com>
+
=head1 COPYRIGHT
This program is free software. You can redistribute it and/or modify it