View::TT, perltidy
[catagits/Catalyst-View-TT.git] / lib / Catalyst / View / TT.pm
index 1463bc6..d1353e4 100644 (file)
@@ -6,9 +6,10 @@ use Template;
 use Template::Timer;
 use NEXT;
 
-our $VERSION = '0.19';
+our $VERSION = '0.20';
 
 __PACKAGE__->mk_accessors('template');
+__PACKAGE__->mk_accessors('include_path');
 
 =head1 NAME
 
@@ -30,9 +31,9 @@ Catalyst::View::TT - Template View Class
               MyApp->path_to( 'root', 'src' ), 
               MyApp->path_to( 'root', 'lib' ), 
             ],
-            PRE_PROCESS => 'config/main',
-            WRAPPER     => 'site/wrapper',
-           TEMPLATE_EXTENSION => '.tt',
+            PRE_PROCESS        => 'config/main',
+            WRAPPER            => 'site/wrapper',
+            TEMPLATE_EXTENSION => '.tt',
 
             # two optional config items
             CATALYST_VAR => 'Catalyst',
@@ -166,6 +167,15 @@ Note that any configuration items defined by one of the earlier
 methods will be overwritten by items of the same name provided by the
 latter methods.  
 
+=head2 DYNAMIC INCLUDE_PATH
+
+It is sometimes needed to dynamically add additional paths to the 
+INCLUDE_PATH variable of the template object. This can be done by setting
+'additional_include_paths' on stash to a referrence to an array with 
+additional paths:
+
+    $c->stash->{additional_template_paths} = [$c->config->{root} . '/test_include_path']; 
+
 =head2 RENDERING VIEWS
 
 The view plugin renders the template specified in the C<template>
@@ -223,17 +233,48 @@ and reads the application config.
 
 =cut
 
-sub new {
-    my ( $class, $c, $arguments ) = @_;
+sub _coerce_paths {
+    my ( $paths, $dlim ) = shift;
+    return () if ( !$paths );
+    return @{$paths} if ( ref $paths eq 'ARRAY' );
 
-    my $root = $c->config->{root};
+    # tweak delim to ignore C:/
+    unless ( defined $dlim ) {
+        $dlim = ( $^O eq 'MSWin32' ) ? ':(?!\\/)' : ':';
+    }
+    return split( /$dlim/, $paths );
+}
 
+sub new {
+    my ( $class, $c, $arguments ) = @_;
+    my $delim = $class->config->{DELIMITER} || $arguments->{DELIMITER};
+    my $include_path;
+    if ( ref $arguments->{INCLUDE_PATH} eq 'ARRAY' ) {
+        $include_path = $arguments->{INCLUDE_PATH};
+    }
+    elsif ( ref $class->config->{INCLUDE_PATH} eq 'ARRAY' ) {
+        $include_path = $class->config->{INCLUDE_PATH};
+    }
+    else {
+        my @include_path
+            = _coerce_paths( $arguments->{INCLUDE_PATH}, $delim );
+        if ( !@include_path ) {
+            @include_path
+                = _coerce_paths( $class->config->{INCLUDE_PATH}, $delim );
+        }
+        if ( !@include_path ) {
+            my $root = $c->config->{root};
+            my $base = Path::Class::dir( $root, 'base' );
+            @include_path = ( "$root", "$base" );
+        }
+        $include_path = \@include_path;
+    }
     my $config = {
         EVAL_PERL          => 0,
         TEMPLATE_EXTENSION => '',
-        INCLUDE_PATH       => [ $root, "$root/base" ],
         %{ $class->config },
-        %{$arguments}
+        %{$arguments},
+        INCLUDE_PATH => $include_path,
     };
 
     # if we're debugging and/or the TIMER option is set, then we install
@@ -243,7 +284,8 @@ sub new {
     if ( $config->{TIMER} ) {
         if ( $config->{CONTEXT} ) {
             $c->log->error(
-                'Cannot use Template::Timer - a TT CONFIG is already defined');
+                'Cannot use Template::Timer - a TT CONFIG is already defined'
+            );
         }
         else {
             $config->{CONTEXT} = Template::Timer->new(%$config);
@@ -257,16 +299,16 @@ sub new {
 
     my $self = $class->NEXT::new(
         $c,
-        {
-            template => Template->new($config) || do {
+        {   template => Template->new($config) || do {
                 my $error = Template->error();
                 $c->log->error($error);
                 $c->error($error);
                 return undef;
-              },
-        %{$config},
+            },
+            %{$config},
         },
     );
+    $self->include_path($include_path);
     $self->config($config);
 
     return $self;
@@ -290,7 +332,8 @@ sub process {
     my ( $self, $c ) = @_;
 
     my $template = $c->stash->{template}
-      || $c->request->match . $self->config->{TEMPLATE_EXTENSION};
+        || ( $c->request->match || $c->request->action )
+        . $self->config->{TEMPLATE_EXTENSION};
 
     unless ($template) {
         $c->log->debug('No template specified for rendering') if $c->debug;
@@ -304,14 +347,15 @@ sub process {
     my $vars = {
         defined $cvar
         ? ( $cvar => $c )
-        : (
-            c    => $c,
+        : ( c    => $c,
             base => $c->req->base,
             name => $c->config->{name}
         ),
         %{ $c->stash() }
     };
-
+    unshift @{ $self->include_path },
+        @{ $c->stash->{additional_template_paths} }
+        if ref $c->stash->{additional_template_paths};
     unless ( $self->template->process( $template, $vars, \$output ) ) {
         my $error = $self->template->error;
         $error = qq/Couldn't render template "$error"/;
@@ -319,6 +363,9 @@ sub process {
         $c->error($error);
         return 0;
     }
+    splice @{ $self->include_path }, 0,
+        scalar @{ $c->stash->{additional_template_paths} }
+        if ref $c->stash->{additional_template_paths};
 
     unless ( $c->response->content_type ) {
         $c->response->content_type('text/html; charset=utf-8');