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