Add subinclude_using, bump version to 0.03
Nilson Santos Figueiredo JĂșnior [Fri, 6 Feb 2009 19:49:59 +0000 (19:49 +0000)]
lib/Catalyst/View/Component/SubInclude.pm
lib/Catalyst/View/Component/SubInclude/ESI.pm
lib/Catalyst/View/Component/SubInclude/SubRequest.pm
lib/Catalyst/View/Component/SubInclude/Visit.pm
t/ESITest/root/index.tt

index 77c5945..20909a6 100644 (file)
@@ -10,11 +10,11 @@ Catalyst::View::Component::SubInclude - Use subincludes in your Catalyst views
 
 =head1 VERSION
 
-Version 0.02
+Version 0.03
 
 =cut
 
-our $VERSION = '0.02';
+our $VERSION = '0.03';
 
 =head1 SYNOPSIS
 
@@ -29,6 +29,7 @@ our $VERSION = '0.02';
 Then, somewhere in your templates:
 
   [% subinclude('/my/widget') %]
+  [% subinclude_using('SubRequest', '/page/footer') %]
 
 =head1 DESCRIPTION
 
@@ -45,7 +46,7 @@ ESI (L<http://www.catalystframework.org/calendar/2008/17>) or any other
 sub-include plugin you might want to implement. An LWP plugin seems useful and
 might be developed in the future.
 
-=head1 STASH FUNCTION
+=head1 STASH FUNCTIONS
 
 This component does its magic by exporting a C<subinclude> coderef entry to the
 stash. This way, it's easily accessible by the templates (which is the most 
@@ -54,7 +55,15 @@ common use-case).
 =head2 C<subinclude( $path, @args )>
 
 This will render and return the body of the included resource (as specified by 
-C<$path>).
+C<$path>) using the default subinclude plugin.
+
+=head2 C<subinclude_using( $plugin, $path, @args )>
+
+This will render and return the body of the included resource (as specified by 
+C<$path>) using the specified subinclude plugin.
+
+The C<subinclude> function above is implemented basically as a shortcut which 
+calls this function using the default plugin as the first parameter.
 
 =head1 SUBINCLUDE PLUGINS
 
@@ -63,7 +72,7 @@ L<SubRequest|Catalyst::Plugin::View::Component::SubRequest>,
 L<Visit|Catalyst::Plugin::View::Component::Visit> and 
 L<ESI|Catalyst::Plugin::View::Component::ESI>.
 
-By default, the SubRequest plugin will be used. This can be changed in the 
+By default, the C<SubRequest> plugin will be used. This can be changed in the 
 view's configuration options (either in the config file or in the view module
 itself). 
 
@@ -73,6 +82,14 @@ Configuration file example:
       subinclude_plugin   ESI
   </View::TT>
 
+=head2 C<set_subinclude_plugin( $plugin )>
+
+This method changes the current active subinclude plugin in runtime. It expects
+the plugin suffix (e.g. C<ESI> or C<SubRequest>) or a fully-qualified class 
+name in the C<Catalyst::View::Component::SubInclude> namespace.
+
+=head2 Writing plugins
+
 If writing your own plugin, keep in kind plugins are required to implement a 
 class method C<generate_subinclude> with the following signature:
 
@@ -80,12 +97,15 @@ class method C<generate_subinclude> with the following signature:
       my ($class, $c, @args) = @_;
   }
 
+The default plugin is stored in the C<subinclude_plugin> which can be changed
+in runtime. It expects a fully qualified class name.
+
 =cut
 
 has 'subinclude_plugin' => (
     is => 'rw',
     isa => 'ClassName'
-); 
+);
 
 around 'new' => sub {
     my $next = shift;
@@ -94,12 +114,7 @@ around 'new' => sub {
     my $self = $class->$next( @_ );
     
     my $subinclude_plugin = $self->config->{subinclude_plugin} || 'SubRequest';
-    my $subinclude_class  = __PACKAGE__ . '::' . $subinclude_plugin;
-    
-    eval "require $subinclude_class";
-    croak "Error requiring $subinclude_class: $@" if $@;
-
-    $self->subinclude_plugin( $subinclude_class );
+    $self->set_subinclude_plugin( $subinclude_plugin );
     
     $self;
 };
@@ -108,13 +123,45 @@ around 'render' => sub {
     my $next = shift;
     my ($self, $c, @args) = @_;
     
-    $c->stash->{subinclude} = sub {
-        $self->subinclude_plugin->generate_subinclude( $c, @_ );
-    };
+    $c->stash->{subinclude}       = sub { $self->_subinclude( $c, @_ ) };
+    $c->stash->{subinclude_using} = sub { $self->_subinclude_using( $c, @_ ) };
 
     $self->$next( $c, @args );
 };
 
+sub set_subinclude_plugin {
+    my ($self, $plugin) = @_;
+
+    my $subinclude_class = $self->_subinclude_plugin_class_name( $plugin );
+    $self->subinclude_plugin( $subinclude_class );
+}
+
+sub _subinclude {
+    my ($self, $c, @args) = @_;
+    $self->_subinclude_using( $c, $self->subinclude_plugin, @args );
+}
+
+sub _subinclude_using {
+    my ($self, $c, $plugin, @args) = @_;
+    $plugin = $self->_subinclude_plugin_class_name($plugin);
+    $plugin->generate_subinclude( $c, @args );
+}
+
+sub _subinclude_plugin_class_name {
+    my ($self, $plugin) = @_;
+    
+    # check if name is already fully qualified
+    my $pkg = __PACKAGE__;
+    return $plugin if $plugin =~ /^$pkg/;
+
+    my $class_name = __PACKAGE__ . '::' . $plugin;
+    
+    eval "require $class_name";
+    croak "Error requiring $class_name: $@" if $@;
+
+    $class_name;
+}
+
 =head1 SEE ALSO
 
 L<Catalyst::Plugin::SubRequest|Catalyst::Plugin::SubRequest>, 
index 635d978..7dfc7b3 100644 (file)
@@ -8,11 +8,11 @@ Catalyst::View::Component::SubInclude::ESI - Edge Side Includes (ESI) plugin for
 
 =head1 VERSION
 
-Version 0.02
+Version 0.03
 
 =cut
 
-our $VERSION = '0.02';
+our $VERSION = '0.03';
 
 =head1 SYNOPSIS
 
index baedb69..7ba7828 100644 (file)
@@ -11,11 +11,11 @@ Catalyst::View::Component::SubInclude::SubRequest - Sub-requests plugin for C::V
 
 =head1 VERSION
 
-Version 0.02
+Version 0.03
 
 =cut
 
-our $VERSION = '0.02';
+our $VERSION = '0.03';
 
 =head1 SYNOPSIS
 
index bc7fe01..c82fe73 100644 (file)
@@ -11,11 +11,11 @@ Catalyst::View::Component::SubInclude::Visit - visit() plugin for C::V::Componen
 
 =head1 VERSION
 
-Version 0.02
+Version 0.03
 
 =cut
 
-our $VERSION = '0.02';
+our $VERSION = '0.03';
 
 =head1 SYNOPSIS
 
index 2bab3a9..0c96357 100644 (file)
@@ -1,3 +1,9 @@
-ESI Test, will include /time_include<br/>
+SubInclude test: will include /time_include using default plugin [% c.view('TT').subinclude_plugin %]<br/>
 [% subinclude('/time_include', { 'foo' => 'bar'} ) %]<br/>
 [% subinclude('/time_args', ['test'], { 'baz' => 'quux' }) %]<br/>
+
+<br/><br/>
+Test subinclude using specific plugins:<br/>
+[% subinclude_using('SubRequest', '/time_include', { 'plugin' => 'SubRequest'} ) %]<br/>
+[% subinclude_using('Visit', '/time_include', { 'plugin' => 'Visit'} ) %]<br/>
+[% subinclude_using('ESI', '/time_include', { 'plugin' => 'ESI'} ) %]<br/>