1 package Catalyst::View::Component::SubInclude;
5 use Catalyst::Utils ();
7 use MooseX::Types::Moose qw/Str HashRef/;
8 use namespace::clean -except => 'meta';
10 with 'Catalyst::Component::ContextClosure';
14 Catalyst::View::Component::SubInclude - Use subincludes in your Catalyst views
22 our $VERSION = '0.11';
23 $VERSION = eval $VERSION;
27 package MyApp::View::TT;
30 extends 'Catalyst::View::TT';
31 with 'Catalyst::View::Component::SubInclude';
33 __PACKAGE__->config( subinclude_plugin => 'SubRequest' );
35 Then, somewhere in your templates:
37 [% subinclude('/my/widget') %]
38 [% subinclude_using('SubRequest', '/page/footer') %]
42 C<Catalyst::View::Component::SubInclude> allows you to include content in your
43 templates (or, more generally, somewhere in your view's C<render> processing)
44 which comes from another action in your application. It's implemented as a
45 L<Moose::Role|Moose::Role>, so using L<Moose|Moose> in your view is required.
47 Simply put, it's a way to include the output of a Catalyst sub-request somewhere
50 It's built in an extensible way so that you're free to use sub-requests,
51 Varnish ESI (L<http://www.catalystframework.org/calendar/2008/17>) or any other
52 sub-include plugin you might want to implement.
54 =head1 STASH FUNCTIONS
56 This component does its magic by exporting a C<subinclude> coderef entry to the
57 stash. This way, it's easily accessible by the templates (which is the most
60 =head2 C<subinclude( $path, @args )>
62 This will render and return the body of the included resource (as specified by
63 C<$path>) using the default subinclude plugin.
65 =head2 C<subinclude_using( $plugin, $path, @args )>
67 This will render and return the body of the included resource (as specified by
68 C<$path>) using the specified subinclude plugin.
70 The C<subinclude> function above is implemented basically as a shortcut which
71 calls this function using the default plugin as the first parameter.
73 =head1 SUBINCLUDE PLUGINS
75 The module comes with two subinclude plugins:
76 L<SubRequest|Catalyst::Plugin::View::Component::SubRequest>,
77 L<Visit|Catalyst::Plugin::View::Component::Visit> and
78 L<ESI|Catalyst::Plugin::View::Component::ESI>.
80 By default, the C<SubRequest> plugin will be used. This can be changed in the
81 view's configuration options (either in the config file or in the view module
85 subinclude_plugin => 'ESI',
92 http_method => 'POST',
95 '/foo/' => 'http://www.foo.com/',
101 You can change each plugins' configuration through the keys in the 'subinclude'
102 config key (example above)
104 =head2 C<set_subinclude_plugin( $plugin )>
106 This method changes the current active subinclude plugin in runtime. It expects
107 the plugin suffix (e.g. C<ESI> or C<SubRequest>) or a fully-qualified class
108 name in the C<Catalyst::View::Component::SubInclude> namespace.
110 =head2 Writing plugins
112 If writing your own plugin, keep in kind plugins are required to implement a
113 class method C<generate_subinclude> with the following signature:
115 sub generate_subinclude {
116 my ($class, $c, @args) = @_;
119 The default plugin is stored in the C<subinclude_plugin> which can be changed
120 in runtime. It expects a fully qualified class name.
124 has 'subinclude_plugin' => (
132 default => sub { {} },
135 around 'new' => sub {
139 my $self = $class->$next( @_ );
141 my $subinclude_plugin = $self->config->{subinclude_plugin} || 'SubRequest';
142 $self->set_subinclude_plugin( $subinclude_plugin );
147 before 'render' => sub {
148 my ($self, $c, @args) = @_;
150 $c->stash->{subinclude} = $self->make_context_closure(sub { $self->_subinclude( @_ ) }, $c);
151 $c->stash->{subinclude_using} = $self->make_context_closure(sub { $self->_subinclude_using( @_ ) }, $c);
154 sub set_subinclude_plugin {
155 my ($self, $plugin) = @_;
157 my $subinclude_class = blessed $self->_subinclude_plugin_class_instance( $plugin );
158 $self->subinclude_plugin( $subinclude_class );
162 my ($self, $c, @args) = @_;
163 $self->_subinclude_using( $c, $self->subinclude_plugin, @args );
166 sub _subinclude_using {
167 my ($self, $c, $plugin, @args) = @_;
168 $plugin = $self->_subinclude_plugin_class_instance($plugin);
169 $plugin->generate_subinclude( $c, @args );
172 has _subinclude_plugin_class_instance_cache => (
175 default => sub { {} },
178 sub _subinclude_plugin_class_instance {
179 my ($self, $plugin) = @_;
181 my $cache = $self->_subinclude_plugin_class_instance_cache;
182 return $cache->{$plugin} if exists $cache->{$plugin};
184 my $plugin_config = Catalyst::Utils::merge_hashes(
185 $self->subinclude->{ALL}||{},
186 $self->subinclude->{$plugin}||{}
188 my $short_class = $plugin_config->{'class'} ?
189 delete $plugin_config->{'class'}
191 my $class = $short_class =~ /::/ ?
193 : __PACKAGE__ . '::' . $short_class;
195 Class::MOP::load_class($class);
197 return $cache->{$class} = $class->new($plugin_config);
202 L<Catalyst::Plugin::SubRequest|Catalyst::Plugin::SubRequest>,
203 L<Moose::Role|Moose::Role>, L<Moose|Moose>,
204 L<http://www.catalystframework.org/calendar/2008/17>
208 Please report any bugs or feature requests to
209 C<bug-catalyst-view-component-subinclude at rt.cpan.org>, or through the web interface at
210 L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Catalyst-View-Component-SubInclude>.
211 I will be notified, and then you'll automatically be notified of progress on
212 your bug as I make changes.
216 Nilson Santos Figueiredo Junior, C<< <nilsonsfj at cpan.org> >>
220 Tomas Doran (t0m) C<< <bobtfish@bobtfish.net >>.
222 Vladimir Timofeev, C<< <vovkasm at gmail.com> >>.
224 Wallace Reis (wreis) C<< <wreis@cpan.org> >>.
228 Development sponsored by Ionzero LLC L<http://www.ionzero.com/>.
230 =head1 COPYRIGHT & LICENSE
232 Copyright (C) 2010 Nilson Santos Figueiredo Junior and the above contributors.
234 Copyright (C) 2009 Nilson Santos Figueiredo Junior.
236 Copyright (C) 2009 Ionzero LLC.
238 This program is free software; you can redistribute it and/or modify it
239 under the same terms as Perl itself.