Corrected 'snippets' -> 'captures' in Chained Intro
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Manual / Intro.pod
CommitLineData
fc7ec1d9 1=head1 NAME
2
3Catalyst::Manual::Intro - Introduction to Catalyst
4
5=head1 DESCRIPTION
6
670b3d78 7This is a brief introduction to Catalyst. It explains the most important
aa2b0d97 8features of how Catalyst works and shows how to get a simple application
9up and running quickly. For an introduction (without code) to Catalyst
10itself, and why you should be using it, see L<Catalyst::Manual::About>.
6c5c02ba 11For a systematic step-by-step introduction to writing an application
12with Catalyst, see L<Catalyst::Manual::Tutorial>.
fc7ec1d9 13
14=head2 What is Catalyst?
15
129cfe74 16Catalyst is an elegant web application framework, extremely flexible yet
56d8daeb 17extremely simple. It's similar to Ruby on Rails, Spring (Java), and
6c5c02ba 18L<Maypole>, upon which it was originally based. Its most important
19design philosphy is to provide easy access to all the tools you need to
20develop web applications, with few restrictions on how you need to use
21these tools. Under Catalyst, it is always possible to do things in a
22different way. However, this does mean that it is always possible to do
23things in a different way. Other web frameworks are simpler to use and
24easy to get up and running, but achieve this by locking the programmer
25into a single set of tools. Catalyst's emphasis on flexibility means
26that you have to think more to use it. We view this as a feature.
fc7ec1d9 27
28=head3 MVC
29
e178a66a 30Catalyst follows the Model-View-Controller (MVC) design pattern,
31allowing you to easily separate concerns, like content, presentation,
32and flow control, into separate modules. This separation allows you to
33modify code that handles one concern without affecting code that handles
34the others. Catalyst promotes the re-use of existing Perl modules that
35already handle common web application concerns well.
fc7ec1d9 36
e178a66a 37Here's how the M, V, and C map to those concerns, with examples of
38well-known Perl modules you may want to use for each.
fc7ec1d9 39
40=over 4
41
4a6895ce 42=item * B<Model>
fc7ec1d9 43
e112461a 44Access and modify content (data). L<DBIx::Class>, L<Class::DBI>,
6c5c02ba 45L<Xapian>, L<Net::LDAP>...
fc7ec1d9 46
4a6895ce 47=item * B<View>
fc7ec1d9 48
e178a66a 49Present content to the user. L<Template Toolkit|Template>,
50L<Mason|HTML::Mason>, L<HTML::Template>...
fc7ec1d9 51
4a6895ce 52=item * B<Controller>
fc7ec1d9 53
129cfe74 54Control the whole request phase, check parameters, dispatch actions, flow
56d8daeb 55control. Catalyst itself!
fc7ec1d9 56
57=back
58
d4ef4999 59If you're unfamiliar with MVC and design patterns, you may want to
60check out the original book on the subject, I<Design Patterns>, by
61Gamma, Helm, Johnson, and Vlissides, also known as the Gang of Four
62(GoF). Many, many web application frameworks are based on MVC, which
63is becoming a popular design method for web applications.
fc7ec1d9 64
65=head3 Flexibility
66
e178a66a 67Catalyst is much more flexible than many other frameworks. We'll talk
68more about this later, but rest assured you can use your favorite Perl
69modules with Catalyst.
fc7ec1d9 70
71=over 4
72
72d9bfc7 73=item * B<Multiple Models, Views, and Controllers>
fc7ec1d9 74
e178a66a 75To build a Catalyst application, you handle each type of concern inside
76special modules called L</Components>. Often this code will be very
77simple, just calling out to Perl modules like those listed above under
78L</MVC>. Catalyst handles these components in a very flexible way. Use
79as many Models, Views, and Controllers as you like, using as many
80different Perl modules as you like, all in the same application. Want to
81manipulate multiple databases, and retrieve some data via LDAP? No
82problem. Want to present data from the same Model using L<Template
83Toolkit|Template> and L<PDF::Template>? Easy.
fc7ec1d9 84
cda8d1ac 85=item * B<Reuseable Components>
fc7ec1d9 86
e178a66a 87Not only does Catalyst promote the re-use of already existing Perl
88modules, it also allows you to re-use your Catalyst components in
89multiple Catalyst applications.
fc7ec1d9 90
4a6895ce 91=item * B<Unrestrained URL-to-Action Dispatching>
fc7ec1d9 92
cccc887d 93Catalyst allows you to dispatch any URLs to any application L</Actions>,
e178a66a 94even through regular expressions! Unlike most other frameworks, it
95doesn't require mod_rewrite or class and method names in URLs.
fc7ec1d9 96
e178a66a 97With Catalyst you register your actions and address them directly. For
98example:
fc7ec1d9 99
e3dc9d78 100 sub hello : Global {
fc7ec1d9 101 my ( $self, $context ) = @_;
66f6e959 102 $context->response->body('Hello World!');
5a8ed4fe 103 }
fc7ec1d9 104
105Now http://localhost:3000/hello prints "Hello World!".
106
4a6895ce 107=item * B<Support for CGI, mod_perl, Apache::Request>
fc7ec1d9 108
109Use L<Catalyst::Engine::Apache> or L<Catalyst::Engine::CGI>.
110
111=back
112
113=head3 Simplicity
114
e178a66a 115The best part is that Catalyst implements all this flexibility in a very
116simple way.
fc7ec1d9 117
6f4e1683 118=over 4
119
4a6895ce 120=item * B<Building Block Interface>
fc7ec1d9 121
e178a66a 122Components interoperate very smoothly. For example, Catalyst
cccc887d 123automatically makes a L</Context> object available to every
e178a66a 124component. Via the context, you can access the request object, share
125data between components, and control the flow of your
126application. Building a Catalyst application feels a lot like snapping
129cfe74 127together toy building blocks, and everything just works.
fc7ec1d9 128
4a6895ce 129=item * B<Component Auto-Discovery>
fc7ec1d9 130
e178a66a 131No need to C<use> all of your components. Catalyst automatically finds
132and loads them.
fc7ec1d9 133
4a6895ce 134=item * B<Pre-Built Components for Popular Modules>
fc7ec1d9 135
e112461a 136See L<Catalyst::Model::DBIC::Schema> for L<DBIx::Class>, or
137L<Catalyst::View::TT> for L<Template Toolkit|Template>.
fc7ec1d9 138
72d9bfc7 139=item * B<Built-in Test Framework>
fc7ec1d9 140
e178a66a 141Catalyst comes with a built-in, lightweight http server and test
142framework, making it easy to test applications from the command line.
fc7ec1d9 143
4a6895ce 144=item * B<Helper Scripts>
fc7ec1d9 145
e178a66a 146Catalyst provides helper scripts to quickly generate running starter
147code for components and unit tests. See L<Catalyst::Helper>.
fc7ec1d9 148
6f4e1683 149=back
150
fc7ec1d9 151=head2 Quickstart
152
e178a66a 153Here's how to install Catalyst and get a simple application up and
154running, using the helper scripts described above.
fc7ec1d9 155
156=head3 Install
157
d538823f 158 $ perl -MCPAN -e 'install Task::Catalyst'
fc7ec1d9 159
160=head3 Setup
161
2feb6632 162 $ catalyst.pl MyApp
b33ed88c 163 # output omitted
2feb6632 164 $ cd MyApp
ac4a0ae0 165 $ script/myapp_create.pl controller Library::Login
fc7ec1d9 166
167=head3 Run
168
b33ed88c 169 $ script/myapp_server.pl
fc7ec1d9 170
129cfe74 171Now visit these locations with your favorite browser or user agent to see
172Catalyst in action:
fc7ec1d9 173
51aec62b 174(NOTE: Although we create a controller here, we don't actually use it.
175Both of these URLs should take you to the welcome page.)
176
177
fc7ec1d9 178=over 4
179
180=item http://localhost:3000/
181
ac4a0ae0 182=item http://localhost:3000/library/login/
fc7ec1d9 183
184=back
185
56d8daeb 186Easy!
fc7ec1d9 187
188=head2 How It Works
189
e178a66a 190Let's see how Catalyst works, by taking a closer look at the components
191and other parts of a Catalyst application.
fc7ec1d9 192
193=head3 Application Class
194
e178a66a 195In addition to the Model, View, and Controller components, there's a
196single class that represents your application itself. This is where you
c37916b0 197configure your application, load plugins, and extend Catalyst.
fc7ec1d9 198
199 package MyApp;
200
201 use strict;
202 use Catalyst qw/-Debug/;
203
204 MyApp->config(
205 name => 'My Application',
fc7ec1d9 206
b33ed88c 207 # You can put anything else you want in here:
208 my_configuration_variable => 'something',
fc7ec1d9 209 );
fc7ec1d9 210 1;
211
6c5c02ba 212In older versions of Catalyst, the application class was where you put
213global actions. However, as of version 5.66, the recommended practice is
214to place such actions in a special Root controller (see #####, below),
215to avoid namespace collisions.
216
fc7ec1d9 217=over 4
218
4a6895ce 219=item * B<name>
fc7ec1d9 220
56d8daeb 221The name of your application.
fc7ec1d9 222
fc7ec1d9 223=back
224
e178a66a 225Optionally, you can specify a B<root> parameter for templates and static
226data. If omitted, Catalyst will try to auto-detect the directory's
227location. You can define as many parameters as you want for plugins or
228whatever you need. You can access them anywhere in your application via
229C<$context-E<gt>config-E<gt>{$param_name}>.
fc7ec1d9 230
6c5c02ba 231###### We need a short section on configuration here.
232
fc7ec1d9 233=head3 Context
234
e178a66a 235Catalyst automatically blesses a Context object into your application
236class and makes it available everywhere in your application. Use the
cccc887d 237Context to directly interact with Catalyst and glue your L</Components>
e178a66a 238together. For example, if you need to use the Context from within a
239Template Toolkit template, it's already there:
c42f5bbf 240
241 <h1>Welcome to [% c.config.name %]!</h1>
fc7ec1d9 242
e178a66a 243As illustrated in our URL-to-Action dispatching example, the Context is
244always the second method parameter, behind the Component object
245reference or class name itself. Previously we called it C<$context> for
246clarity, but most Catalyst developers just call it C<$c>:
fc7ec1d9 247
e3dc9d78 248 sub hello : Global {
fc7ec1d9 249 my ( $self, $c ) = @_;
66f6e959 250 $c->res->body('Hello World!');
5a8ed4fe 251 }
fc7ec1d9 252
253The Context contains several important objects:
254
255=over 4
256
257=item * L<Catalyst::Request>
258
259 $c->request
260 $c->req # alias
261
129cfe74 262The request object contains all kinds of request-specific information, like
263query parameters, cookies, uploads, headers, and more.
fc7ec1d9 264
265 $c->req->params->{foo};
266 $c->req->cookies->{sessionid};
267 $c->req->headers->content_type;
268 $c->req->base;
269
afdca3a3 270=item * L<Catalyst::Response>
fc7ec1d9 271
272 $c->response
273 $c->res # alias
274
129cfe74 275The response is like the request, but contains just response-specific
276information.
fc7ec1d9 277
66f6e959 278 $c->res->body('Hello World');
fc7ec1d9 279 $c->res->status(404);
280 $c->res->redirect('http://oook.de');
281
282=item * L<Catalyst::Config>
283
284 $c->config
fc7ec1d9 285 $c->config->root;
286 $c->config->name;
287
288=item * L<Catalyst::Log>
289
290 $c->log
fc7ec1d9 291 $c->log->debug('Something happened');
292 $c->log->info('Something you should know');
293
4a6895ce 294=item * B<Stash>
fc7ec1d9 295
296 $c->stash
fc7ec1d9 297 $c->stash->{foo} = 'bar';
d4ef4999 298 $c->stash->{baz} = {baz => 'qox'};
299 $c->stash->{fred} = [qw/ wilma pebbles/];
300
301and so on.
fc7ec1d9 302
303=back
304
129cfe74 305The last of these, the stash, is a universal hash for sharing data among
306application components. For an example, we return to our 'hello' action:
fc7ec1d9 307
e3dc9d78 308 sub hello : Global {
5a8ed4fe 309 my ( $self, $c ) = @_;
310 $c->stash->{message} = 'Hello World!';
4c6807d2 311 $c->forward('show_message');
5a8ed4fe 312 }
fc7ec1d9 313
4c6807d2 314 sub show_message : Private {
5a8ed4fe 315 my ( $self, $c ) = @_;
66f6e959 316 $c->res->body( $c->stash->{message} );
5a8ed4fe 317 }
fc7ec1d9 318
e178a66a 319Note that the stash should be used only for passing data in an
320individual request cycle; it gets cleared at a new request. If you need
321to maintain more persistent data, use a session.
dd25a192 322
fc7ec1d9 323=head3 Actions
324
56d8daeb 325A Catalyst controller is defined by its actions. An action is a
326subroutine with a special attribute. You've already seen some examples
327of actions in this document. The URL (for example
328http://localhost.3000/foo/bar) consists of two parts, the base
329(http://localhost:3000/ in this example) and the path (foo/bar). Please
330note that the trailing slash after the hostname[:port] always belongs to
331base and not to the action.
cda8d1ac 332
c37916b0 333=over 4
334
335=item * B<Application Wide Actions>
336
337Actions which are called at the root level of the application
6c5c02ba 338(e.g. http://localhost:3000/ ) go in MyApp::Controller::Root, like
c37916b0 339this:
340
341 package MyApp::Controller::Root;
342 use base 'Catalyst::Controller';
343 # Sets the actions in this controller to be registered with no prefix
344 # so they function identically to actions created in MyApp.pm
345 __PACKAGE__->config->{namespace} = '';
346 sub default : Private {
347 my ( $self, $context ) = @_;
348 $context->response->body('Catalyst rocks!');
349 }
350 1;
351
c37916b0 352=back
353
c37916b0 354=head4 Action types
355
cda8d1ac 356Catalyst supports several types of actions:
fc7ec1d9 357
358=over 4
359
56d8daeb 360=item * B<Literal> (B<Path> actions)
fc7ec1d9 361
e178a66a 362 package MyApp::Controller::My::Controller;
f29c48dd 363 sub bar : Path('foo/bar') { }
fc7ec1d9 364
e178a66a 365Literal C<Path> actions will act relative to their current
366namespace. The above example matches only
367http://localhost:3000/my/controller/foo/bar. If you start your path with
368a forward slash, it will match from the root. Example:
0cf56dbc 369
e178a66a 370 package MyApp::Controller::My::Controller;
0cf56dbc 371 sub bar : Path('/foo/bar') { }
372
fc7ec1d9 373Matches only http://localhost:3000/foo/bar.
374
e178a66a 375 package MyApp::Controller::My::Controller;
0cf56dbc 376 sub bar : Path { }
377
e178a66a 378By leaving the C<Path> definition empty, it will match on the namespace
379root. The above code matches http://localhost:3000/my/controller.
0cf56dbc 380
4a6895ce 381=item * B<Regex>
fc7ec1d9 382
b33ed88c 383 sub bar : Regex('^item(\d+)/order(\d+)$') { }
fc7ec1d9 384
129cfe74 385Matches any URL that matches the pattern in the action key, e.g.
e178a66a 386http://localhost:3000/item23/order42. The '' around the regexp is
387optional, but perltidy likes it. :)
b33ed88c 388
e178a66a 389Regex matches act globally, i.e. without reference to the namespace from
390which it is called, so that a C<bar> method in the
391C<MyApp::Controller::Catalog::Order::Process> namespace won't match any
392form of C<bar>, C<Catalog>, C<Order>, or C<Process> unless you
393explicitly put this in the regex. To achieve the above, you should
394consider using a C<LocalRegex> action.
66f6e959 395
396=item * B<LocalRegex>
397
398 sub bar : LocalRegex('^widget(\d+)$') { }
fc7ec1d9 399
66f6e959 400LocalRegex actions act locally. If you were to use C<bar> in
0cf56dbc 401C<MyApp::Controller::Catalog>, the above example would match urls like
402http://localhost:3000/catalog/widget23.
403
e178a66a 404If you omit the "C<^>" from your regex, then it will match any depth
405from the controller and not immediately off of the controller name. The
406following example differs from the above code in that it will match
0cf56dbc 407http://localhost:3000/catalog/foo/widget23 as well.
408
409 package MyApp::Controller::Catalog;
410 sub bar : LocalRegex('widget(\d+)$') { }
66f6e959 411
e178a66a 412For both LocalRegex and Regex actions, if you use capturing parentheses
413to extract values within the matching URL, those values are available in
2982e768 414the C<$c-E<gt>req-E<gt>captures> array. In the above example, "widget23"
e178a66a 415would capture "23" in the above example, and
2982e768 416C<$c-E<gt>req-E<gt>captures-E<gt>[0]> would be "23". If you want to pass
e178a66a 417arguments at the end of your URL, you must use regex action keys. See
418L</URL Path Handling> below.
fc7ec1d9 419
5882c86e 420=item * B<Chained>
e76c67cb 421
e5c7adea 422The C<Chained> attribute allows you to chain public path parts together
423by their private names. A chain part's path can be specified with C<PathPart>
424and can be declared to expect an arbitrary number of arguments. The endpoint
425of the chain specifies how many arguments it gets through the C<Args>
426attribute. C<:Args(0)> would be none at all, C<:Args> without an integer
427would be unlimited. The path parts that aren't endpoints are using
428C<Captures> to specify how many parameters they expect to receive. As an
429example setup:
430
431 package MyApp::Controller::Greeting;
432 use base qw/ Catalyst::Controller /;
433
434 # this is the beginning of our chain
435 sub hello : PathPart('hello') Chained('/') Captures(1) {
436 my ( $self, $c, $integer ) = @_;
437 $c->stash->{ message } = "Hello ";
438 $c->stash->{ arg_sum } = $integer;
08141496 439 }
e76c67cb 440
e5c7adea 441 # this is our endpoint, because it has no :Captures
442 sub world : PathPart('world') Chained('hello') Args(1) {
443 my ( $self, $c, $integer ) = @_;
444 $c->stash->{ message } .= "World!";
445 $c->stash->{ arg_sum } += $integer;
e76c67cb 446
e5c7adea 447 $c->response->body( join "<br/>\n" =>
448 $c->stash->{ message }, $c->stash->{ arg_sum } );
08141496 449 }
450
e5c7adea 451The debug output provides a separate table for chained actions, showing
452the whole chain as it would match and the actions it contains. Here's
453an example of the startup output with our actions above:
454
455 ...
456 [debug] Loaded Path Part actions:
457 .-----------------------+------------------------------.
458 | Path Spec | Private |
459 +-----------------------+------------------------------+
460 | /hello/*/world/* | /greeting/hello (1) |
461 | | => /greeting/world |
462 '-----------------------+------------------------------'
463 ...
464
465As you can see, Catalyst only deals with chains as whole path and
466builds one for each endpoint, which are the actions with C<:Chained>
467but without C<:Captures>.
468
469Let's assume this application gets a request at the path
470C</hello/23/world/12>, what happens then? First, Catalyst will dispatch
471to the C<hello> action and pass the value C<23> as argument to it after
472the context. It does so because we have previously used C<:Captures(1)>
473to declare that it has one path part after itself as it's argument. We
474told Catalyst that this is the beginning of the chain by specifying
475C<:Chained('/')>. Also note that instead of saying C<:PathPart('hello')>
476we could also just have said C<:PathPart>, as it defaults to the name of
477the action.
478
479After C<hello> has run, Catalyst goes on to dispatch to the C<world>
480action. This is the last action to be called, as Catalyst knows this
481is an endpoint because we specified no C<:Captures> attribute. Nevertheless
482we specify that this action expects an argument, but at this point we're
483using C<:Args(1)> to do that. We could also have said C<:Args> or leave
484it out alltogether, which would mean this action gets all arguments that
485are there. This action's C<:Chained> attribute says C<hello> and tells
486Catalyst that the C<hello> action in the current controller is it's
487parent.
488
489With this we have built a chain consisting of two public path parts.
490C<hello> captures one part of the path as it's argument, and also specifies
491the path root as it's parent. So this part is C</hello/$arg>. The next part
492is the endpoint C<world>, expecting one argument. It sums up to the path
493part C<world/$arg>. This leads to a complete chain of
494C</hello/$arg/world/$arg> which is matched against the requested paths.
495
496This example application would, if run and called by e.g.
497C</hello/23/world/12>, set the stash value C<message> to C<Hello > and
498the value C<arg_sum> to C<23>. The C<world> action would then append
499C<World!> to C<message> and add C<12> to the stash's C<arg_sum> value.
500For the sake of simplicity no view is shown. Instead we just put the
501values of the stash into our body. So the output would look like:
502
503 Hello World!
504 35
505
506And our test server would've given us this debugging output for the
507request:
508
509 ...
510 [debug] "GET" request for "hello/23/world/12" from "127.0.0.1"
511 [debug] Path is "/greeting/world"
512 [debug] Arguments are "12"
513 [info] Request took 0.164113s (6.093/s)
514 .------------------------------------------+-----------.
515 | Action | Time |
516 +------------------------------------------+-----------+
517 | /greeting/hello | 0.000029s |
518 | /greeting/world | 0.000024s |
519 '------------------------------------------+-----------'
520 ...
521
522What would be common usecases of this dispatching technique? It gives the
523possibility to split up logic that contains steps that each depend on each
524other. An example would be, for example, a wiki path like
525C</wiki/FooBarPage/rev/23/view>. This chain can be easily built with
526these actions:
527
528 sub wiki : PathPart('wiki') Chained('/') Captures(1) {
529 my ( $self, $c, $page_name ) = @_;
530 # load the page named $page_name and put the object
531 # into the stash
08141496 532 }
533
e5c7adea 534 sub rev : PathPart('rev') Chained('wiki') Captures(1) {
535 my ( $self, $c, $revision_id ) = @_;
536 # use the page object in the stash to get at it's
537 # revision with number $revision_id
08141496 538 }
539
e5c7adea 540 sub view : PathPart Chained('rev') Args(0) {
541 my ( $self, $c ) = @_;
542 # display the revision in our stash. An other option
543 # would be to forward a compatible object to the action
544 # that displays the default wiki pages, unless we want
545 # a different interface here, for example restore
546 # functionality.
547 }
e76c67cb 548
e5c7adea 549It would now be possible to add other endpoints. For example C<restore> to
550restore this specific revision as current state.
551
552Also, you of course don't have to put all the chained actions in one
553controller. The specification of the parent through C<:Chained> also takes
554an absolute action path as it's argument. Just specify it with a leading
555C</>.
556
557If you want, for example, to have actions for the public paths
558C</foo/12/edit> and C</foo/12>, just specify two actions with
559C<:PathPart('foo')> and C<:Chained('/')>. The handler for the former
560path needs a C<:Captures(1)> attribute and a endpoint with
561C<:PathPart('edit')> and C<:Chained('foo')>. For the latter path give
562the action just a C<:Args(1)> to mark it as endpoint. This sums up to
563this debugging output:
564
565 ...
566 [debug] Loaded Path Part actions:
567 .-----------------------+------------------------------.
568 | Path Spec | Private |
569 +-----------------------+------------------------------+
570 | /foo/* | /controller/foo_view |
571 | /foo/*/edit | /controller/foo_load (1) |
572 | | => /controller/edit |
573 '-----------------------+------------------------------'
574 ...
575
576Here's a more detailed specification of the attributes belonging to
577C<:Chained>:
578
579=over 8
580
581=item PathPart
582
583Sets the name of this part of the chain. If it is specified without
584arguments, it takes the name of the action as default. So basically
585C<sub foo :PathPart> and C<sub foo :PathPart('foo')> are identical.
586This can also contain slashes to bind to a deeper level. An action
587with C<sub bar :PathPart('foo/bar') :Chained('/')> would bind to
588C</foo/bar/...>. If you don't specify C<:PathPart> it has the same
589effect as using C<:PathPart>, it would default to the action name.
590
591=item Chained
592
593Has to be specified for every child in the chain. Possible values are
594absolute and relative private action paths, with the relatives pointing
595to the current controller, or a single slash C</> to tell Catalyst that
596this is the root of a chain. The attribute C<:Chained> without aguments
597also defaults to the C</> behaviour.
598
599Due to the fact that you can specify an absolute path to the parent
600action, it doesn't matter to Catalyst where that parent is located. So,
601if your design requests it, you can redispatch a chain through every
602controller or namespace you want.
603
604Another interesting possibility gives C<:Chained('.')>, which chains
605itself to an action with the path of the current controllers namespace.
606For example:
607
608 # in MyApp::Controller::Foo
609 sub bar : Chained Captures(1) { ... }
610
611 # in MyApp::Controller::Foo::Bar
612 sub baz : Chained('.') Args(1) { ... }
613
614This builds up a chain like C</bar/*/baz/*>. The specification of C<.>
615as argument to Chained here chains the C<baz> action to an action with
616the path of the current controller namespace, namely C</foo/bar>. That
617action chains directly to C</>, so the above chain comes out as end
618product.
619
620=item Captures
621
622Also has to be specified for every part of the chain that is not an
623endpoint. With this attribute Catalyst knows how many of the following
624parts of the path (separated by C</>) this action wants to captures as
625it's arguments. If it doesn't expect any, just specify C<:Captures(0)>.
626The captures get passed to the action's C<@_> right after the context,
627but you can also find them as array reference in
27c0dd05 628C<$c-E<gt>request-E<gt>captures-E<gt>[$level]>. The C<$level> is the
e5c7adea 629level of the action in the chain that captured the parts of the path.
630
631An action that is part of a chain (read: that has a C<:Chained> attribute)
632but has no C<:Captures> attribute is treated by Catalyst as a chain end.
633
634=item Args
635
636By default, endpoints receive the rest of the arguments in the path. You
637can tell Catalyst through C<:Args> explicitly how many arguments your
638endpoint expects, just like you can with C<:Captures>. Note that this
639also influences if this chain is invoked on a request. A chain with an
640endpoint specifying one argument will only match if exactly one argument
641exists in the path.
642
643You can specify an exact number of arguments like C<:Args(3)>, including
644C<0>. If you just say C<:Args> without any arguments, it is the same as
645leaving it out alltogether: The chain is matched independent of the number
646of path parts after the endpoint.
647
648Just like with C<:Captures>, the arguments get passed to the action in
649C<@_> after the context object. They can also be reached through
650C<$c-E<gt>request-E<gt>arguments>.
e76c67cb 651
e5c7adea 652=back
08141496 653
56d8daeb 654=item * B<Top-level> (B<Global>)
cda8d1ac 655
c37916b0 656 package MyApp::Controller::Foo;
cda8d1ac 657 sub foo : Global { }
658
c37916b0 659Matches http://localhost:3000/foo. The function name is mapped
660directly to the application base. You can provide an equivalent
661function in this case by doing the following:
662
663 package MyApp::Controller::Root
664 sub foo : Local { }
cda8d1ac 665
56d8daeb 666=item * B<Namespace-Prefixed> (B<Local>)
fc7ec1d9 667
e178a66a 668 package MyApp::Controller::My::Controller;
e3dc9d78 669 sub foo : Local { }
fc7ec1d9 670
cda8d1ac 671Matches http://localhost:3000/my/controller/foo.
fc7ec1d9 672
129cfe74 673This action type indicates that the matching URL must be prefixed with a
e178a66a 674modified form of the component's class (package) name. This modified
675class name excludes the parts that have a pre-defined meaning in
676Catalyst ("MyApp::Controller" in the above example), replaces "::" with
677"/", and converts the name to lower case. See L</Components> for a full
678explanation of the pre-defined meaning of Catalyst component class
679names.
fc7ec1d9 680
4a6895ce 681=item * B<Private>
fc7ec1d9 682
5a8ed4fe 683 sub foo : Private { }
fc7ec1d9 684
e178a66a 685Matches no URL, and cannot be executed by requesting a URL that
686corresponds to the action key. Private actions can be executed only
687inside a Catalyst application, by calling the C<forward> method:
fc7ec1d9 688
5a8ed4fe 689 $c->forward('foo');
fc7ec1d9 690
129cfe74 691See L</Flow Control> for a full explanation of C<forward>. Note that, as
fc9c8698 692discussed there, when forwarding from another component, you must use
693the absolute path to the method, so that a private C<bar> method in your
694C<MyApp::Controller::Catalog::Order::Process> controller must, if called
695from elsewhere, be reached with
696C<$c-E<gt>forward('/catalog/order/process/bar')>.
fc7ec1d9 697
baf5120b 698=item * B<Args>
699
700Args is not an action type per se, but an action modifier - it adds a match
701restriction to any action it's provided to, requiring only as many path parts
702as are specified for the action to be valid - for example in
703MyApp::Controller::Foo,
704
705 sub bar :Local
706
707would match any URL starting /foo/bar/. To restrict this you can do
708
709 sub bar :Local :Args(1)
710
711to only match /foo/bar/*/
712
fc7ec1d9 713=back
714
b33ed88c 715B<Note:> After seeing these examples, you probably wonder what the point
56d8daeb 716is of defining names for regex and path actions. Every public action is
717also a private one, so you have one unified way of addressing components
718in your C<forward>s.
cda8d1ac 719
72d9bfc7 720=head4 Built-in Private Actions
fc7ec1d9 721
fc9c8698 722In response to specific application states, Catalyst will automatically
723call these built-in private actions in your application class:
fc7ec1d9 724
725=over 4
726
cda8d1ac 727=item * B<default : Private>
fc7ec1d9 728
fc9c8698 729Called when no other action matches. Could be used, for example, for
730displaying a generic frontpage for the main app, or an error page for
731individual controllers.
fc7ec1d9 732
0cf56dbc 733If C<default> isn't acting how you would expect, look at using a
cccc887d 734L</Literal> C<Path> action (with an empty path string). The difference is
e178a66a 735that C<Path> takes arguments relative from the namespace and C<default>
736I<always> takes arguments relative from the root, regardless of what
737controller it's in.
0cf56dbc 738
66f6e959 739=item * B<index : Private>
740
741C<index> is much like C<default> except that it takes no arguments
e178a66a 742and it is weighted slightly higher in the matching process. It is
743useful as a static entry point to a controller, e.g. to have a static
61a9002d 744welcome page. Note that it's also weighted higher than Path.
66f6e959 745
cda8d1ac 746=item * B<begin : Private>
fc7ec1d9 747
fc9c8698 748Called at the beginning of a request, before any matching actions are
749called.
fc7ec1d9 750
cda8d1ac 751=item * B<end : Private>
4a6895ce 752
fc7ec1d9 753Called at the end of a request, after all matching actions are called.
754
fc9c8698 755=back
756
6b10c72b 757=head4 Built-in actions in controllers/autochaining
fc7ec1d9 758
e178a66a 759 Package MyApp::Controller::Foo;
cda8d1ac 760 sub begin : Private { }
5a8ed4fe 761 sub default : Private { }
eff5f524 762 sub auto : Private { }
fc7ec1d9 763
fc9c8698 764You can define built-in private actions within your controllers as
765well. The actions will override the ones in less-specific controllers,
766or your application class. In other words, for each of the three
767built-in private actions, only one will be run in any request
e178a66a 768cycle. Thus, if C<MyApp::Controller::Catalog::begin> exists, it will be
769run in place of C<MyApp::begin> if you're in the C<catalog> namespace,
770and C<MyApp::Controller::Catalog::Order::begin> would override this in
771turn.
fc9c8698 772
eff5f524 773In addition to the normal built-in actions, you have a special action
774for making chains, C<auto>. Such C<auto> actions will be run after any
fc9c8698 775C<begin>, but before your action is processed. Unlike the other
eff5f524 776built-ins, C<auto> actions I<do not> override each other; they will be
777called in turn, starting with the application class and going through to
778the I<most> specific class. I<This is the reverse of the order in which
779the normal built-ins override each other>.
fc9c8698 780
781Here are some examples of the order in which the various built-ins
782would be called:
cda8d1ac 783
784=over 4
785
fc9c8698 786=item for a request for C</foo/foo>
cda8d1ac 787
788 MyApp::begin
80ef2e6d 789 MyApp::auto
e178a66a 790 MyApp::Controller::Foo::default # in the absence of MyApp::Controller::Foo::Foo
cda8d1ac 791 MyApp::end
792
fc9c8698 793=item for a request for C</foo/bar/foo>
cda8d1ac 794
e178a66a 795 MyApp::Controller::Foo::Bar::begin
80ef2e6d 796 MyApp::auto
e178a66a 797 MyApp::Controller::Foo::auto
798 MyApp::Controller::Foo::Bar::auto
799 MyApp::Controller::Foo::Bar::default # for MyApp::Controller::Foo::Bar::foo
800 MyApp::Controller::Foo::Bar::end
80ef2e6d 801
802=back
803
fc9c8698 804The C<auto> action is also distinguished by the fact that you can break
805out of the processing chain by returning 0. If an C<auto> action returns
8060, any remaining actions will be skipped, except for C<end>. So, for the
807request above, if the first auto returns false, the chain would look
808like this:
80ef2e6d 809
810=over 4
811
fc9c8698 812=item for a request for C</foo/bar/foo> where first C<auto> returns
813false
80ef2e6d 814
e178a66a 815 MyApp::Controller::Foo::Bar::begin
80ef2e6d 816 MyApp::auto
e178a66a 817 MyApp::Controller::Foo::Bar::end
cda8d1ac 818
819=back
4a6895ce 820
fc9c8698 821An example of why one might use this is an authentication action: you
822could set up a C<auto> action to handle authentication in your
823application class (which will always be called first), and if
824authentication fails, returning 0 would skip any remaining methods
825for that URL.
03805733 826
fc9c8698 827B<Note:> Looking at it another way, C<auto> actions have to return a
828true value to continue processing! You can also C<die> in the autochain
829action; in that case, the request will go straight to the finalize
830stage, without processing further actions.
03805733 831
6b10c72b 832=head4 URL Path Handling
4a6895ce 833
70d5ae49 834You can pass variable arguments as part of the URL path, separated with
835forward slashes (/). If the action is a Regex or LocalRegex, the '$' anchor
836must be used. For example, suppose you want to handle C</foo/$bar/$baz>,
837where C<$bar> and C<$baz> may vary:
4a6895ce 838
cda8d1ac 839 sub foo : Regex('^foo$') { my ($self, $context, $bar, $baz) = @_; }
4a6895ce 840
fc9c8698 841But what if you also defined actions for C</foo/boo> and C</foo/boo/hoo>?
4a6895ce 842
f29c48dd 843 sub boo : Path('foo/boo') { .. }
844 sub hoo : Path('foo/boo/hoo') { .. }
4a6895ce 845
846Catalyst matches actions in most specific to least specific order:
847
848 /foo/boo/hoo
849 /foo/boo
fc9c8698 850 /foo # might be /foo/bar/baz but won't be /foo/boo/hoo
4a6895ce 851
fc9c8698 852So Catalyst would never mistakenly dispatch the first two URLs to the
853'^foo$' action.
fc7ec1d9 854
70d5ae49 855If a Regex or LocalRegex action doesn't use the '$' anchor, the action will
856still match a URL containing arguments, however the arguments won't be
857available via C<@_>.
858
6b10c72b 859=head4 Parameter Processing
2ef2fb0f 860
fc9c8698 861Parameters passed in the URL query string are handled with methods in
862the L<Catalyst::Request> class. The C<param> method is functionally
863equivalent to the C<param> method of C<CGI.pm> and can be used in
864modules that require this.
2ef2fb0f 865
866 # http://localhost:3000/catalog/view/?category=hardware&page=3
867 my $category = $c->req->param('category');
868 my $current_page = $c->req->param('page') || 1;
869
870 # multiple values for single parameter name
871 my @values = $c->req->param('scrolling_list');
872
873 # DFV requires a CGI.pm-like input hash
874 my $results = Data::FormValidator->check($c->req->params, \%dfv_profile);
875
fc7ec1d9 876=head3 Flow Control
877
d08ced28 878You control the application flow with the C<forward> method, which
879accepts the key of an action to execute. This can be an action in the
880same or another Catalyst controller, or a Class name, optionally
881followed by a method name. After a C<forward>, the control flow will
882return to the method from which the C<forward> was issued.
883
884A C<forward> is similar to a method call. The main differences are that
885it wraps the call in an C<eval> to allow exception handling; it
886automatically passes along the context object (C<$c> or C<$context>);
887and it allows profiling of each call (displayed in the log with
888debugging enabled).
fc7ec1d9 889
e3dc9d78 890 sub hello : Global {
5a8ed4fe 891 my ( $self, $c ) = @_;
892 $c->stash->{message} = 'Hello World!';
d08ced28 893 $c->forward('check_message'); # $c is automatically included
5a8ed4fe 894 }
fc7ec1d9 895
4c6807d2 896 sub check_message : Private {
5a8ed4fe 897 my ( $self, $c ) = @_;
898 return unless $c->stash->{message};
4c6807d2 899 $c->forward('show_message');
5a8ed4fe 900 }
fc7ec1d9 901
4c6807d2 902 sub show_message : Private {
5a8ed4fe 903 my ( $self, $c ) = @_;
66f6e959 904 $c->res->body( $c->stash->{message} );
5a8ed4fe 905 }
3323f920 906
6c5c02ba 907A C<forward> does not create a new request, so your request object
908(C<$c-E<gt>req>) will remain unchanged. This is a key difference between
909using C<forward> and issuing a redirect.
3323f920 910
d08ced28 911You can pass new arguments to a C<forward> by adding them
912in an anonymous array. In this case C<$c-E<gt>req-E<gt>args>
913will be changed for the duration of the C<forward> only; upon
914return, the original value of C<$c-E<gt>req-E<gt>args> will
915be reset.
3323f920 916
917 sub hello : Global {
918 my ( $self, $c ) = @_;
919 $c->stash->{message} = 'Hello World!';
d08ced28 920 $c->forward('check_message',[qw/test1/]);
921 # now $c->req->args is back to what it was before
3323f920 922 }
923
d08ced28 924 sub check_message : Private {
925 my ( $self, $c ) = @_;
fabf3a10 926 my $first_argument = $c->req->args->[0]; # now = 'test1'
d08ced28 927 # do something...
928 }
b248fa4a 929
d08ced28 930As you can see from these examples, you can just use the method name as
931long as you are referring to methods in the same controller. If you want
932to forward to a method in another controller, or the main application,
933you will have to refer to the method by absolute path.
cda8d1ac 934
935 $c->forward('/my/controller/action');
d08ced28 936 $c->forward('/default'); # calls default in main application
fc7ec1d9 937
d08ced28 938Here are some examples of how to forward to classes and methods.
fc7ec1d9 939
e3dc9d78 940 sub hello : Global {
5a8ed4fe 941 my ( $self, $c ) = @_;
e178a66a 942 $c->forward(qw/MyApp::Model::Hello say_hello/);
5a8ed4fe 943 }
fc7ec1d9 944
e3dc9d78 945 sub bye : Global {
5a8ed4fe 946 my ( $self, $c ) = @_;
e178a66a 947 $c->forward('MyApp::Model::Hello'); # no method: will try 'process'
5a8ed4fe 948 }
fc7ec1d9 949
e178a66a 950 package MyApp::Model::Hello;
fc7ec1d9 951
952 sub say_hello {
953 my ( $self, $c ) = @_;
66f6e959 954 $c->res->body('Hello World!');
fc7ec1d9 955 }
956
957 sub process {
958 my ( $self, $c ) = @_;
66f6e959 959 $c->res->body('Goodbye World!');
fc7ec1d9 960 }
961
d08ced28 962Note that C<forward> returns to the calling action and continues
13436c14 963processing after the action finishes. If you want all further processing
964in the calling action to stop, use C<detach> instead, which will execute
965the C<detach>ed action and not return to the calling sub. In both cases,
966Catalyst will automatically try to call process() if you omit the
967method.
fc7ec1d9 968
969=head3 Components
970
56d8daeb 971Catalyst has an uncommonly flexible component system. You can define as
cccc887d 972many L</Models>, L</Views>, and L</Controllers> as you like.
fc7ec1d9 973
56d8daeb 974All components must inherit from L<Catalyst::Base>, which provides a
975simple class structure and some common class methods like C<config> and
976C<new> (constructor).
fc7ec1d9 977
e178a66a 978 package MyApp::Controller::Catalog;
fc7ec1d9 979
980 use strict;
981 use base 'Catalyst::Base';
982
983 __PACKAGE__->config( foo => 'bar' );
984
985 1;
986
6b10c72b 987You don't have to C<use> or otherwise register Models, Views, and
988Controllers. Catalyst automatically discovers and instantiates them
989when you call C<setup> in the main application. All you need to do is
990put them in directories named for each Component type. Notice that you
6c5c02ba 991can use a terse alias for each one.
fc7ec1d9 992
993=over 4
994
4a6895ce 995=item * B<MyApp/Model/>
fc7ec1d9 996
4a6895ce 997=item * B<MyApp/M/>
fc7ec1d9 998
4a6895ce 999=item * B<MyApp/View/>
fc7ec1d9 1000
4a6895ce 1001=item * B<MyApp/V/>
fc7ec1d9 1002
4a6895ce 1003=item * B<MyApp/Controller/>
fc7ec1d9 1004
4a6895ce 1005=item * B<MyApp/C/>
fc7ec1d9 1006
1007=back
1008
6c5c02ba 1009In older versions of Catalyst, the recommended practice (and the one
1010automatically created by helper scripts) was to name the directories
1011C<M/>, C<V/>, and C<C/>. Though these still work, we now recommend
1012the use of the full names.
1013
fc7ec1d9 1014=head4 Views
1015
129cfe74 1016To show how to define views, we'll use an already-existing base class for the
1017L<Template Toolkit|Template>, L<Catalyst::View::TT>. All we need to do is
1018inherit from this class:
fc7ec1d9 1019
e178a66a 1020 package MyApp::View::TT;
fc7ec1d9 1021
1022 use strict;
1023 use base 'Catalyst::View::TT';
1024
1025 1;
1026
b33ed88c 1027(You can also generate this automatically by using the helper script:
1028
1029 script/myapp_create.pl view TT TT
1030
fb9257c1 1031where the first C<TT> tells the script that the name of the view should
1032be C<TT>, and the second that it should be a Template Toolkit view.)
b33ed88c 1033
129cfe74 1034This gives us a process() method and we can now just do
e178a66a 1035$c->forward('MyApp::View::TT') to render our templates. The base class
1036makes process() implicit, so we don't have to say
1037C<$c-E<gt>forward(qw/MyApp::View::TT process/)>.
fc7ec1d9 1038
e3dc9d78 1039 sub hello : Global {
5a8ed4fe 1040 my ( $self, $c ) = @_;
1041 $c->stash->{template} = 'hello.tt';
1042 }
fc7ec1d9 1043
5a8ed4fe 1044 sub end : Private {
1045 my ( $self, $c ) = @_;
e178a66a 1046 $c->forward('MyApp::View::TT');
5a8ed4fe 1047 }
fc7ec1d9 1048
6b10c72b 1049You normally render templates at the end of a request, so it's a perfect
1050use for the global C<end> action.
fc7ec1d9 1051
129cfe74 1052Also, be sure to put the template under the directory specified in
6b10c72b 1053C<$c-E<gt>config-E<gt>{root}>, or you'll be forced to look at our
1054eyecandy debug screen. ;)
fc7ec1d9 1055
1056=head4 Models
1057
e178a66a 1058To show how to define models, again we'll use an already-existing base
e112461a 1059class, this time for L<DBIx::Class>: L<Catalyst::Model::DBIC::Schema>.
1060We'll also need L<DBIx::Class::Schema::Loader>.
fc7ec1d9 1061
1062But first, we need a database.
1063
1064 -- myapp.sql
1065 CREATE TABLE foo (
1066 id INTEGER PRIMARY KEY,
1067 data TEXT
1068 );
1069
1070 CREATE TABLE bar (
1071 id INTEGER PRIMARY KEY,
1072 foo INTEGER REFERENCES foo,
1073 data TEXT
1074 );
1075
1076 INSERT INTO foo (data) VALUES ('TEST!');
1077
1078
1079 % sqlite /tmp/myapp.db < myapp.sql
1080
e112461a 1081Now we can create a DBIC::SchemaLoader component for this database.
fc7ec1d9 1082
e112461a 1083 script/myapp_create.pl model DBIC DBIC::SchemaLoader 'dbi:SQLite:/tmp/myapp.db'
fc7ec1d9 1084
e112461a 1085L<DBIx::Class::Schema::Loader> automatically loads table layouts and
1086relationships. Use the stash to pass data to your templates.
fc7ec1d9 1087
e112461a 1088We add the following to MyApp/Controller/Root.pm
b248fa4a 1089
e112461a 1090 sub view : Global {
1091 my ( $self, $c, $id ) = @_;
1092
1093 $c->stash->{item} = $c->model('DBIC::Foo')->find($id);
1094 }
fc7ec1d9 1095
e112461a 1096 1;
1097
5a8ed4fe 1098 sub end : Private {
1099 my ( $self, $c ) = @_;
e112461a 1100
5a8ed4fe 1101 $c->stash->{template} ||= 'index.tt';
e112461a 1102 $c->forward( $c->view('TT') );
5a8ed4fe 1103 }
fc7ec1d9 1104
e112461a 1105We then create a new template file "root/index.tt" containing:
fc7ec1d9 1106
e112461a 1107 The Id's data is [% item.data %]
fc7ec1d9 1108
6b10c72b 1109Models do not have to be part of your Catalyst application; you
1110can always call an outside module that serves as your Model:
1111
1112 # in a Controller
1113 sub list : Local {
1114 my ( $self, $c ) = @_;
e112461a 1115
6b10c72b 1116 $c->stash->{template} = 'list.tt';
e112461a 1117
1118 use Some::Outside::DBIC::Module;
1119 my @records = Some::Outside::DBIC::Module->search({
1120 artist => 'sri',
1121 });
1122
6b10c72b 1123 $c->stash->{records} = \@records;
1124 }
1125
1126But by using a Model that is part of your Catalyst application, you gain
1127several things: you don't have to C<use> each component, Catalyst will
1128find and load it automatically at compile-time; you can C<forward> to
26e73131 1129the module, which can only be done to Catalyst components; and only
6b10c72b 1130Catalyst components can be fetched with
e178a66a 1131C<$c-E<gt>model('SomeModel')>.
6b10c72b 1132
1133Happily, since many people have existing Model classes that they
1134would like to use with Catalyst (or, conversely, they want to
1135write Catalyst models that can be used outside of Catalyst, e.g.
1136in a cron job), it's trivial to write a simple component in
1137Catalyst that slurps in an outside Model:
1138
e112461a 1139 package MyApp::Model::DB;
1140 use base qw/Catalyst::Model::DBIC::Schema/;
1141 __PACKAGE__->config(
1142 schema_class => 'Some::DBIC::Schema',
cccc887d 1143 connect_info => ['dbi:SQLite:foo.db', '', '', {AutoCommit=>1}]
e112461a 1144 );
6b10c72b 1145 1;
1146
e112461a 1147and that's it! Now C<Some::DBIC::Schema> is part of your
1148Cat app as C<MyApp::Model::DB>.
6b10c72b 1149
fc7ec1d9 1150=head4 Controllers
1151
129cfe74 1152Multiple controllers are a good way to separate logical domains of your
1153application.
fc7ec1d9 1154
e178a66a 1155 package MyApp::Controller::Login;
fc7ec1d9 1156
c02f7490 1157 use base qw/Catalyst::Controller/;
1158
1159 sub sign_in : Path("sign-in") { }
1160 sub new_password : Path("new-password") { }
1161 sub sign_out : Path("sign-out") { }
fc7ec1d9 1162
e178a66a 1163 package MyApp::Controller::Catalog;
fc7ec1d9 1164
c02f7490 1165 use base qw/Catalyst::Controller/;
1166
e3dc9d78 1167 sub view : Local { }
1168 sub list : Local { }
fc7ec1d9 1169
e178a66a 1170 package MyApp::Controller::Cart;
fc7ec1d9 1171
c02f7490 1172 use base qw/Catalyst::Controller/;
1173
e3dc9d78 1174 sub add : Local { }
1175 sub update : Local { }
1176 sub order : Local { }
fc7ec1d9 1177
c02f7490 1178Note that you can also supply attributes via the Controller's config so long
1179as you have at least one attribute on a subref to be exported (:Action is
1180commonly used for this) - for example the following is equivalent to the same
1181controller above
1182
1183 package MyApp::Controller::Login;
1184
1185 use base qw/Catalyst::Controller/;
1186
1187 __PACKAGE__->config(
1188 actions => {
1189 'sign_in' => { Path => 'sign-in' },
1190 'new_password' => { Path => 'new-password' },
1191 'sign_out' => { Path => 'sign-out' },
1192 },
1193 );
1194
1195 sub sign_in : Action { }
1196 sub new_password : Action { }
1197 sub sign_out : Action { }
1198
24cda51b 1199=head3 Models
1200
1201Models are providers of data. This data could come from anywhere - a search
1202engine index, a database table, etc. Typically the data source does not have
1203much to do with web applications or Catalyst - it could be used to write an
1204offline report generator or a command line tool just the same.
1205
1206The common approach to writing a Catalyst-style model for your application is
1207wrapping a generic model (e.g. L<DBIx::Class::Schema>, a bunch of XMLs, or
1208anything really) with an object that contains configuration data, convenience
1209methods, and so forth.
1210
1211#### editor: move this part to =head3 Components somehow, right after this
1212#### section - this will require deeply rephrasing this paragraph.
1213
1214Technically, within Catalyst a model is a B<component> - an instance of the
1215model's class belonging to the application. It is important to stress that the
1216lifetime of these objects is per application, not per request.
1217
1218While the model base class (L<Catalyst::Model>) provides things like C<config>
1219and stuff to better integrate the model into the application, sometimes this is
1220not enough, and the model requires access to C<$c> itself.
1221
1222Situations where this need might arise include:
1223
1224=over 4
1225
1226=item *
1227
1228Interacting with another model
1229
1230=item *
1231
1232Using per-request data to control behavior
1233
1234=item *
1235
1236Using plugins in (for example L<Catalyst::Plugin::Cache>).
1237
1238=back
1239
6c5c02ba 1240From a style perspective usually it's bad to make your model "too smart"
1241about things - it should worry about business logic and leave the
1242integration details to the controllers. If, however, you find that it
1243does not make sense at all to use an auxillary controller around the
1244model, and the model's need to access C<$c> cannot be sidestepped, there
1245exists a power tool called C<ACCEPT_CONTEXT>.
24cda51b 1246
1247#### editor note: this part is "generic" - it also applies to views and
1248#### controllers.
1249
1250=head3 ACCEPT_CONTEXT
1251
6c5c02ba 1252Whenever you call $c->component("Foo") you get back an object - the
1253instance of the model. If the component supports the C<ACCEPT_CONTEXT>
1254method instead of returning the model itself, the return value of C<<
1255$model->ACCEPT_CONTEXT( $c ) >> will be used.
24cda51b 1256
1257This means that whenever your model/view/controller needs to talk to C<$c> it
1258gets a chance to do this when it's needed.
1259
1260A typical C<ACCEPT_CONTEXT> method will either clone the model and return one
1261with the context object set, or it will return a thin wrapper that contains
1262C<$c> and delegates to the per-application model object.
1263
6c5c02ba 1264A typical C<ACCEPT_CONTEXT> method could look like this:
24cda51b 1265
1266 sub ACCEPT_CONTEXT {
1267 my ( $self, $c, @extra_arguments ) = @_;
1268 bless { %$self, c => $c }, ref($self);
1269 }
1270
1271effectively treating $self as a B<prototype object> that gets a new parameter.
1272C<@extra_arguments> comes from any trailing arguments to
1273C<< $c->component( $bah, @extra_arguments ) >> (or C<< $c->model(...) >>,
1274C<< $c->view(...) >> etc).
1275
1276The life time of this value is B<per usage>, and not per request. To make this
1277per request you can use the following technique:
1278
1279Add a field to C<$c>, like C<my_model_instance>. Then write your
1280C<ACCEPT_CONTEXT> method to look like this:
1281
1282 sub ACCEPT_CONTEXT {
1283 my ( $self, $c ) = @_;
1284
1285 if ( my $per_request = $c->my_model_instance ) {
1286 return $per_request;
1287 } else {
1288 my $new_instance = bless { %$self, c => $c }, ref($self);
1289 Scalar::Util::weaken($new_instance->{c}); # or we have a circular reference
1290 $c->my_model_instance( $new_instance );
1291 return $new_instance;
1292 }
1293 }
1294
1295
fc7ec1d9 1296=head3 Testing
1297
6c5c02ba 1298Catalyst has a built-in http server for testing. (Later, you can easily
1299use a more powerful server, e.g. Apache/mod_perl or FastCGI, in a
1300production environment.)
fc7ec1d9 1301
1302Start your application on the command line...
1303
b33ed88c 1304 script/myapp_server.pl
fc7ec1d9 1305
1306...then visit http://localhost:3000/ in a browser to view the output.
1307
1308You can also do it all from the command line:
1309
b33ed88c 1310 script/myapp_test.pl http://localhost/
fc7ec1d9 1311
1312Have fun!
1313
3cb1db8c 1314=head1 SUPPORT
1315
1316IRC:
1317
1318 Join #catalyst on irc.perl.org.
1319
72d9bfc7 1320Mailing-lists:
3cb1db8c 1321
1322 http://lists.rawmode.org/mailman/listinfo/catalyst
1323 http://lists.rawmode.org/mailman/listinfo/catalyst-dev
1324
fc7ec1d9 1325=head1 AUTHOR
1326
cda8d1ac 1327Sebastian Riedel, C<sri@oook.de>
1328David Naughton, C<naughton@umn.edu>
1329Marcus Ramberg, C<mramberg@cpan.org>
f531dd37 1330Jesse Sheidlower, C<jester@panix.com>
129cfe74 1331Danijel Milicevic, C<me@danijel.de>
c37916b0 1332Kieren Diment, C<kd@totaldatasolution.com>
24cda51b 1333Yuval Kogman, C<nothingmuch@woobling.org>
fc7ec1d9 1334
1335=head1 COPYRIGHT
1336
aa2b0d97 1337This program is free software, you can redistribute it and/or modify it
1338under the same terms as Perl itself.