Moved from Bundle:: to Task::
[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 overview of why and how to use Catalyst. It explains how
8 Catalyst works and shows how to get a simple application up and running
9 quickly.
10
11 =head2 What is Catalyst?
12
13 Catalyst is an elegant web application framework, extremely flexible yet
14 extremely simple. It's similar to Ruby on Rails, Spring (Java) and
15 L<Maypole>, upon which it was originally based.
16
17 =head3 MVC
18
19 Catalyst follows the Model-View-Controller (MVC) design pattern,
20 allowing you to easily separate concerns, like content, presentation,
21 and flow control, into separate modules. This separation allows you to
22 modify code that handles one concern without affecting code that handles
23 the others. Catalyst promotes the re-use of existing Perl modules that
24 already handle common web application concerns well.
25
26 Here's how the M, V, and C map to those concerns, with examples of
27 well-known Perl modules you may want to use for each.
28
29 =over 4
30
31 =item * B<Model>
32
33 Access and modify content (data). L<Class::DBI>, L<Plucene>, L<Net::LDAP>...
34
35 =item * B<View>
36
37 Present content to the user. L<Template Toolkit|Template>,
38 L<Mason|HTML::Mason>, L<HTML::Template>...
39
40 =item * B<Controller>
41
42 Control the whole request phase, check parameters, dispatch actions, flow
43 control. Catalyst!
44
45 =back
46
47 If you're unfamiliar with MVC and design patterns, you may want to check
48 out the original book on the subject, I<Design Patterns>, by Gamma,
49 Helm, Johnson, and Vlissides, also known as the Gang of Four (GoF). You
50 can also just Google it.  Many, many web application frameworks are
51 based on MVC, including all those listed above.
52
53 =head3 Flexibility
54
55 Catalyst is much more flexible than many other frameworks. We'll talk
56 more about this later, but rest assured you can use your favorite Perl
57 modules with Catalyst.
58
59 =over 4
60
61 =item * B<Multiple Models, Views, and Controllers>
62
63 To build a Catalyst application, you handle each type of concern inside
64 special modules called L</Components>. Often this code will be very
65 simple, just calling out to Perl modules like those listed above under
66 L</MVC>. Catalyst handles these components in a very flexible way. Use
67 as many Models, Views, and Controllers as you like, using as many
68 different Perl modules as you like, all in the same application. Want to
69 manipulate multiple databases, and retrieve some data via LDAP? No
70 problem. Want to present data from the same Model using L<Template
71 Toolkit|Template> and L<PDF::Template>? Easy.
72
73 =item * B<Reuseable Components>
74
75 Not only does Catalyst promote the re-use of already existing Perl
76 modules, it also allows you to re-use your Catalyst components in
77 multiple Catalyst applications.
78
79 =item * B<Unrestrained URL-to-Action Dispatching>
80
81 Catalyst allows you to dispatch any URLs to any application L<Actions>,
82 even through regular expressions! Unlike most other frameworks, it
83 doesn't require mod_rewrite or class and method names in URLs.
84
85 With Catalyst you register your actions and address them directly. For
86 example:
87
88     sub hello : Global {
89         my ( $self, $context ) = @_;
90         $context->response->body('Hello World!');
91     }
92
93 Now http://localhost:3000/hello prints "Hello World!".
94
95 =item * B<Support for CGI, mod_perl, Apache::Request>
96
97 Use L<Catalyst::Engine::Apache> or L<Catalyst::Engine::CGI>.
98
99 =back
100
101 =head3 Simplicity
102
103 The best part is that Catalyst implements all this flexibility in a very
104 simple way.
105
106 =over 4
107
108 =item * B<Building Block Interface>
109
110 Components interoperate very smoothly. For example, Catalyst
111 automatically makes a L<Context> object available to every
112 component. Via the context, you can access the request object, share
113 data between components, and control the flow of your
114 application. Building a Catalyst application feels a lot like snapping
115 together toy building blocks, and everything just works.
116
117 =item * B<Component Auto-Discovery>
118
119 No need to C<use> all of your components. Catalyst automatically finds
120 and loads them.
121
122 =item * B<Pre-Built Components for Popular Modules>
123
124 See L<Catalyst::Model::CDBI> for L<Class::DBI>, or L<Catalyst::View::TT>
125 for L<Template Toolkit|Template>.
126
127 =item * B<Built-in Test Framework>
128
129 Catalyst comes with a built-in, lightweight http server and test
130 framework, making it easy to test applications from the command line.
131
132 =item * B<Helper Scripts>
133
134 Catalyst provides helper scripts to quickly generate running starter
135 code for components and unit tests. See L<Catalyst::Helper>.
136
137 =back
138
139 =head2 Quickstart
140
141 Here's how to install Catalyst and get a simple application up and
142 running, using the helper scripts described above.
143
144 =head3 Install
145
146     $ perl -MCPAN -e 'install Task::Catalyst'
147
148 =head3 Setup
149
150     $ catalyst.pl MyApp
151     # output omitted
152     $ cd MyApp
153     $ script/myapp_create.pl controller Library::Login
154
155 =head3 Run
156
157     $ script/myapp_server.pl
158
159 Now visit these locations with your favorite browser or user agent to see
160 Catalyst in action:
161
162 =over 4
163
164 =item http://localhost:3000/
165
166 =item http://localhost:3000/library/login/
167
168 =back
169
170 Dead easy!
171
172 =head2 How It Works
173
174 Let's see how Catalyst works, by taking a closer look at the components
175 and other parts of a Catalyst application.
176
177 =head3 Application Class
178
179 In addition to the Model, View, and Controller components, there's a
180 single class that represents your application itself. This is where you
181 configure your application, load plugins, define application-wide
182 actions, and extend Catalyst.
183
184     package MyApp;
185
186     use strict;
187     use Catalyst qw/-Debug/;
188
189     MyApp->config(
190         name => 'My Application',
191
192         # You can put anything else you want in here:
193         my_configuration_variable => 'something',
194     );
195
196     sub default : Private {
197         my ( $self, $context ) = @_;
198         $context->response->body('Catalyst rocks!');
199     }
200
201     1;
202
203 For most applications, Catalyst requires you to define only one config
204 parameter:
205
206 =over 4
207
208 =item * B<name>
209
210 Name of your application.
211
212 =back
213
214 Optionally, you can specify a B<root> parameter for templates and static
215 data.  If omitted, Catalyst will try to auto-detect the directory's
216 location. You can define as many parameters as you want for plugins or
217 whatever you need. You can access them anywhere in your application via
218 C<$context-E<gt>config-E<gt>{$param_name}>.
219
220 =head3 Context
221
222 Catalyst automatically blesses a Context object into your application
223 class and makes it available everywhere in your application. Use the
224 Context to directly interact with Catalyst and glue your L<Components>
225 together. For example, if you need to use the Context from within a
226 Template Toolkit template, it's already there:
227
228     <h1>Welcome to [% c.config.name %]!</h1>
229
230 As illustrated in our URL-to-Action dispatching example, the Context is
231 always the second method parameter, behind the Component object
232 reference or class name itself. Previously we called it C<$context> for
233 clarity, but most Catalyst developers just call it C<$c>:
234
235     sub hello : Global {
236         my ( $self, $c ) = @_;
237         $c->res->body('Hello World!');
238     }
239
240 The Context contains several important objects:
241
242 =over 4
243
244 =item * L<Catalyst::Request>
245
246     $c->request
247     $c->req # alias
248
249 The request object contains all kinds of request-specific information, like
250 query parameters, cookies, uploads, headers, and more.
251
252     $c->req->params->{foo};
253     $c->req->cookies->{sessionid};
254     $c->req->headers->content_type;
255     $c->req->base;
256
257 =item * L<Catalyst::Response>
258
259     $c->response
260     $c->res # alias
261
262 The response is like the request, but contains just response-specific
263 information.
264
265     $c->res->body('Hello World');
266     $c->res->status(404);
267     $c->res->redirect('http://oook.de');
268
269 =item * L<Catalyst::Config>
270
271     $c->config
272     $c->config->root;
273     $c->config->name;
274
275 =item * L<Catalyst::Log>
276
277     $c->log
278
279     $c->log->debug('Something happened');
280     $c->log->info('Something you should know');
281
282 =item * B<Stash>
283
284     $c->stash
285     $c->stash->{foo} = 'bar';
286
287 =back
288
289 The last of these, the stash, is a universal hash for sharing data among
290 application components. For an example, we return to our 'hello' action:
291
292     sub hello : Global {
293         my ( $self, $c ) = @_;
294         $c->stash->{message} = 'Hello World!';
295         $c->forward('show_message');
296     }
297
298     sub show_message : Private {
299         my ( $self, $c ) = @_;
300         $c->res->body( $c->stash->{message} );
301     }
302
303 Note that the stash should be used only for passing data in an
304 individual request cycle; it gets cleared at a new request. If you need
305 to maintain more persistent data, use a session.
306
307 =head3 Actions
308
309 A Catalyst controller is defined by its actions. An action is a sub with
310 a special attribute. You've already seen some examples of actions in
311 this document. The URL (for example http://localhost.3000/foo/bar)
312 consists of two parts, the base (http://localhost:3000/ in this example)
313 and the path (foo/bar).  Please note that the trailing slash after the
314 hostname[:port] always belongs to base and not to the action.
315
316 Catalyst supports several types of actions:
317
318 =over 4
319
320 =item * B<Literal>
321
322     package MyApp::Controller::My::Controller;
323     sub bar : Path('foo/bar') { }
324
325 Literal C<Path> actions will act relative to their current
326 namespace. The above example matches only
327 http://localhost:3000/my/controller/foo/bar. If you start your path with
328 a forward slash, it will match from the root. Example:
329
330     package MyApp::Controller::My::Controller;
331     sub bar : Path('/foo/bar') { }
332
333 Matches only http://localhost:3000/foo/bar.
334
335     package MyApp::Controller::My::Controller;
336     sub bar : Path { }
337
338 By leaving the C<Path> definition empty, it will match on the namespace
339 root. The above code matches http://localhost:3000/my/controller.
340
341 =item * B<Regex>
342
343     sub bar : Regex('^item(\d+)/order(\d+)$') { }
344
345 Matches any URL that matches the pattern in the action key, e.g.
346 http://localhost:3000/item23/order42. The '' around the regexp is
347 optional, but perltidy likes it. :)
348
349 Regex matches act globally, i.e. without reference to the namespace from
350 which it is called, so that a C<bar> method in the
351 C<MyApp::Controller::Catalog::Order::Process> namespace won't match any
352 form of C<bar>, C<Catalog>, C<Order>, or C<Process> unless you
353 explicitly put this in the regex. To achieve the above, you should
354 consider using a C<LocalRegex> action.
355
356 =item * B<LocalRegex>
357
358     sub bar : LocalRegex('^widget(\d+)$') { }
359
360 LocalRegex actions act locally. If you were to use C<bar> in
361 C<MyApp::Controller::Catalog>, the above example would match urls like
362 http://localhost:3000/catalog/widget23.
363
364 If you omit the "C<^>" from your regex, then it will match any depth
365 from the controller and not immediately off of the controller name. The
366 following example differs from the above code in that it will match
367 http://localhost:3000/catalog/foo/widget23 as well.
368
369     package MyApp::Controller::Catalog;
370     sub bar : LocalRegex('widget(\d+)$') { }
371
372 For both LocalRegex and Regex actions, if you use capturing parentheses
373 to extract values within the matching URL, those values are available in
374 the C<$c-E<gt>req-E<gt>snippets> array. In the above example, "widget23"
375 would capture "23" in the above example, and
376 C<$c-E<gt>req-E<gt>snippets-E<gt>[0]> would be "23". If you want to pass
377 arguments at the end of your URL, you must use regex action keys. See
378 L</URL Path Handling> below.
379
380 =item * B<Top-level>
381
382     package MyApp; 
383     sub foo : Global { }
384
385 Matches http://localhost:3000/foo. The function name is mapped directly
386 to the application base.
387
388 =item * B<Namespace-Prefixed>
389
390     package MyApp::Controller::My::Controller; 
391     sub foo : Local { }
392
393 Matches http://localhost:3000/my/controller/foo. 
394
395 This action type indicates that the matching URL must be prefixed with a
396 modified form of the component's class (package) name. This modified
397 class name excludes the parts that have a pre-defined meaning in
398 Catalyst ("MyApp::Controller" in the above example), replaces "::" with
399 "/", and converts the name to lower case.  See L</Components> for a full
400 explanation of the pre-defined meaning of Catalyst component class
401 names.
402
403 =item * B<Private>
404
405     sub foo : Private { }
406
407 Matches no URL, and cannot be executed by requesting a URL that
408 corresponds to the action key. Private actions can be executed only
409 inside a Catalyst application, by calling the C<forward> method:
410
411     $c->forward('foo');
412
413 See L</Flow Control> for a full explanation of C<forward>. Note that, as
414 discussed there, when forwarding from another component, you must use
415 the absolute path to the method, so that a private C<bar> method in your
416 C<MyApp::Controller::Catalog::Order::Process> controller must, if called
417 from elsewhere, be reached with
418 C<$c-E<gt>forward('/catalog/order/process/bar')>.
419
420 =back
421
422 B<Note:> After seeing these examples, you probably wonder what the point
423 is of defining names for regex and path actions. Actually, every public
424 action is also a private one, so you have one unified way of addressing
425 components in your C<forward>s.
426
427 =head4 Built-in Private Actions
428
429 In response to specific application states, Catalyst will automatically
430 call these built-in private actions in your application class:
431
432 =over 4
433
434 =item * B<default : Private>
435
436 Called when no other action matches. Could be used, for example, for
437 displaying a generic frontpage for the main app, or an error page for
438 individual controllers.
439
440 If C<default> isn't acting how you would expect, look at using a
441 L<Literal> C<Path> action (with an empty path string). The difference is
442 that C<Path> takes arguments relative from the namespace and C<default>
443 I<always> takes arguments relative from the root, regardless of what
444 controller it's in.
445
446 =item * B<index : Private>
447
448 C<index> is much like C<default> except that it takes no arguments
449 and it is weighted slightly higher in the matching process. It is
450 useful as a static entry point to a controller, e.g. to have a static
451 welcome page.
452
453 =item * B<begin : Private>
454
455 Called at the beginning of a request, before any matching actions are
456 called.
457
458 =item * B<end : Private>
459
460 Called at the end of a request, after all matching actions are called.
461
462 =back
463
464 =head4 Built-in actions in controllers/autochaining
465
466     Package MyApp::Controller::Foo;
467     sub begin : Private { }
468     sub default : Private { }
469     sub auto : Private { }
470
471 You can define built-in private actions within your controllers as
472 well. The actions will override the ones in less-specific controllers,
473 or your application class. In other words, for each of the three
474 built-in private actions, only one will be run in any request
475 cycle. Thus, if C<MyApp::Controller::Catalog::begin> exists, it will be
476 run in place of C<MyApp::begin> if you're in the C<catalog> namespace,
477 and C<MyApp::Controller::Catalog::Order::begin> would override this in
478 turn.
479
480 In addition to the normal built-in actions, you have a special action
481 for making chains, C<auto>. Such C<auto> actions will be run after any
482 C<begin>, but before your action is processed. Unlike the other
483 built-ins, C<auto> actions I<do not> override each other; they will be
484 called in turn, starting with the application class and going through to
485 the I<most> specific class. I<This is the reverse of the order in which
486 the normal built-ins override each other>.
487
488 Here are some examples of the order in which the various built-ins
489 would be called:
490
491 =over 4
492
493 =item for a request for C</foo/foo>
494
495   MyApp::begin
496   MyApp::auto
497   MyApp::Controller::Foo::default # in the absence of MyApp::Controller::Foo::Foo
498   MyApp::end
499
500 =item for a request for C</foo/bar/foo>
501
502   MyApp::Controller::Foo::Bar::begin
503   MyApp::auto
504   MyApp::Controller::Foo::auto
505   MyApp::Controller::Foo::Bar::auto
506   MyApp::Controller::Foo::Bar::default # for MyApp::Controller::Foo::Bar::foo
507   MyApp::Controller::Foo::Bar::end
508
509 =back
510
511 The C<auto> action is also distinguished by the fact that you can break
512 out of the processing chain by returning 0. If an C<auto> action returns
513 0, any remaining actions will be skipped, except for C<end>. So, for the
514 request above, if the first auto returns false, the chain would look
515 like this:
516
517 =over 4
518
519 =item for a request for C</foo/bar/foo> where first C<auto> returns
520 false
521
522   MyApp::Controller::Foo::Bar::begin
523   MyApp::auto
524   MyApp::Controller::Foo::Bar::end
525
526 =back
527
528 An example of why one might use this is an authentication action: you
529 could set up a C<auto> action to handle authentication in your
530 application class (which will always be called first), and if
531 authentication fails, returning 0 would skip any remaining methods
532 for that URL.
533
534 B<Note:> Looking at it another way, C<auto> actions have to return a
535 true value to continue processing! You can also C<die> in the autochain
536 action; in that case, the request will go straight to the finalize
537 stage, without processing further actions.
538
539 =head4 URL Path Handling
540
541 You can pass variable arguments as part of the URL path. In this case,
542 you must use regex action keys with '^' and '$' anchors, and the
543 arguments must be separated with forward slashes (/) in the URL. For
544 example, suppose you want to handle C</foo/$bar/$baz>, where C<$bar> and
545 C<$baz> may vary:
546
547     sub foo : Regex('^foo$') { my ($self, $context, $bar, $baz) = @_; }
548
549 But what if you also defined actions for C</foo/boo> and C</foo/boo/hoo>?
550
551     sub boo : Path('foo/boo') { .. }
552     sub hoo : Path('foo/boo/hoo') { .. }
553
554 Catalyst matches actions in most specific to least specific order:
555
556     /foo/boo/hoo
557     /foo/boo
558     /foo # might be /foo/bar/baz but won't be /foo/boo/hoo
559
560 So Catalyst would never mistakenly dispatch the first two URLs to the
561 '^foo$' action.
562
563 =head4 Parameter Processing
564
565 Parameters passed in the URL query string are handled with methods in
566 the L<Catalyst::Request> class. The C<param> method is functionally
567 equivalent to the C<param> method of C<CGI.pm> and can be used in
568 modules that require this.
569
570     # http://localhost:3000/catalog/view/?category=hardware&page=3
571     my $category = $c->req->param('category');
572     my $current_page = $c->req->param('page') || 1;
573
574     # multiple values for single parameter name
575     my @values = $c->req->param('scrolling_list');          
576
577     # DFV requires a CGI.pm-like input hash
578     my $results = Data::FormValidator->check($c->req->params, \%dfv_profile);
579
580 =head3 Flow Control
581
582 You control the application flow with the C<forward> method, which
583 accepts the key of an action to execute. This can be an action in the
584 same or another Catalyst controller, or a Class name, optionally
585 followed by a method name. After a C<forward>, the control flow will
586 return to the method from which the C<forward> was issued.
587
588 A C<forward> is similar to a method call. The main differences are that
589 it wraps the call in an C<eval> to allow exception handling; it
590 automatically passes along the context object (C<$c> or C<$context>);
591 and it allows profiling of each call (displayed in the log with
592 debugging enabled).
593
594     sub hello : Global {
595         my ( $self, $c ) = @_;
596         $c->stash->{message} = 'Hello World!';
597         $c->forward('check_message'); # $c is automatically included
598     }
599
600     sub check_message : Private {
601         my ( $self, $c ) = @_;
602         return unless $c->stash->{message};
603         $c->forward('show_message');
604     }
605
606     sub show_message : Private {
607         my ( $self, $c ) = @_;
608         $c->res->body( $c->stash->{message} );
609     }
610
611 A C<forward> does not create a new request, so your request
612 object (C<$c-E<gt>req>) will remain unchanged. This is a
613 key difference between using C<forward> and issuing a
614 redirect.
615
616 You can pass new arguments to a C<forward> by adding them
617 in an anonymous array. In this case C<$c-E<gt>req-E<gt>args>
618 will be changed for the duration of the C<forward> only; upon
619 return, the original value of C<$c-E<gt>req-E<gt>args> will
620 be reset.
621
622     sub hello : Global {
623         my ( $self, $c ) = @_;
624         $c->stash->{message} = 'Hello World!';
625         $c->forward('check_message',[qw/test1/]);
626         # now $c->req->args is back to what it was before
627     }
628
629     sub check_message : Private {
630         my ( $self, $c ) = @_;
631         my $first_argument = $c->req->args[0]; # now = 'test1'
632         # do something...
633     }
634     
635 As you can see from these examples, you can just use the method name as
636 long as you are referring to methods in the same controller. If you want
637 to forward to a method in another controller, or the main application,
638 you will have to refer to the method by absolute path.
639
640   $c->forward('/my/controller/action');
641   $c->forward('/default'); # calls default in main application
642
643 Here are some examples of how to forward to classes and methods.
644
645     sub hello : Global {
646         my ( $self, $c ) = @_;
647         $c->forward(qw/MyApp::Model::Hello say_hello/);
648     }
649
650     sub bye : Global {
651         my ( $self, $c ) = @_;
652         $c->forward('MyApp::Model::Hello'); # no method: will try 'process'
653     }
654
655     package MyApp::Model::Hello;
656
657     sub say_hello {
658         my ( $self, $c ) = @_;
659         $c->res->body('Hello World!');
660     }
661
662     sub process {
663         my ( $self, $c ) = @_;
664         $c->res->body('Goodbye World!');
665     }
666
667 Note that C<forward> returns to the calling action and continues
668 processing after the action finishes. If you want all further processing
669 in the calling action to stop, use C<detach> instead, which will execute
670 the C<detach>ed action and not return to the calling sub. In both cases,
671 Catalyst will automatically try to call process() if you omit the
672 method.
673
674 =head3 Components
675
676 Catalyst has an uncommonly flexible component system. You can define as many
677 L<Models>, L<Views>, and L<Controllers> as you like.
678
679 All components must inherit from L<Catalyst::Base>, which provides a simple
680 class structure and some common class methods like C<config> and C<new>
681 (constructor).
682
683     package MyApp::Controller::Catalog;
684
685     use strict;
686     use base 'Catalyst::Base';
687
688     __PACKAGE__->config( foo => 'bar' );
689
690     1;
691
692 You don't have to C<use> or otherwise register Models, Views, and
693 Controllers.  Catalyst automatically discovers and instantiates them
694 when you call C<setup> in the main application. All you need to do is
695 put them in directories named for each Component type. Notice that you
696 can use some very terse aliases for each one.
697
698 =over 4
699
700 =item * B<MyApp/Model/> 
701
702 =item * B<MyApp/M/>
703
704 =item * B<MyApp/View/>
705
706 =item * B<MyApp/V/>
707
708 =item * B<MyApp/Controller/>
709
710 =item * B<MyApp/C/>
711
712 =back
713
714 =head4 Views
715
716 To show how to define views, we'll use an already-existing base class for the
717 L<Template Toolkit|Template>, L<Catalyst::View::TT>. All we need to do is
718 inherit from this class:
719
720     package MyApp::View::TT;
721
722     use strict;
723     use base 'Catalyst::View::TT';
724
725     1;
726
727 (You can also generate this automatically by using the helper script:
728
729     script/myapp_create.pl view TT TT
730
731 where the first C<TT> tells the script that the name of the view should
732 be C<TT>, and the second that it should be a Template Toolkit view.)
733
734 This gives us a process() method and we can now just do
735 $c->forward('MyApp::View::TT') to render our templates. The base class
736 makes process() implicit, so we don't have to say
737 C<$c-E<gt>forward(qw/MyApp::View::TT process/)>.
738
739     sub hello : Global {
740         my ( $self, $c ) = @_;
741         $c->stash->{template} = 'hello.tt';
742     }
743
744     sub end : Private {
745         my ( $self, $c ) = @_;
746         $c->forward('MyApp::View::TT');
747     }
748
749 You normally render templates at the end of a request, so it's a perfect
750 use for the global C<end> action.
751
752 Also, be sure to put the template under the directory specified in
753 C<$c-E<gt>config-E<gt>{root}>, or you'll be forced to look at our
754 eyecandy debug screen. ;)
755
756 =head4 Models
757
758 To show how to define models, again we'll use an already-existing base
759 class, this time for L<Class::DBI>: L<Catalyst::Model::CDBI>.
760
761 But first, we need a database.
762
763     -- myapp.sql
764     CREATE TABLE foo (
765         id INTEGER PRIMARY KEY,
766         data TEXT
767     );
768
769     CREATE TABLE bar (
770         id INTEGER PRIMARY KEY,
771         foo INTEGER REFERENCES foo,
772         data TEXT
773     );
774
775     INSERT INTO foo (data) VALUES ('TEST!');
776
777
778     % sqlite /tmp/myapp.db < myapp.sql
779
780 Now we can create a CDBI component for this database.
781
782     package MyApp::Model::CDBI;
783
784     use strict;
785     use base 'Catalyst::Model::CDBI';
786
787     __PACKAGE__->config(
788         dsn           => 'dbi:SQLite:/tmp/myapp.db',
789         relationships => 1
790     );
791
792     1;
793
794 Catalyst automatically loads table layouts and relationships. Use the
795 stash to pass data to your templates.
796
797     package MyApp;
798
799     use strict;
800     use Catalyst '-Debug';
801
802     __PACKAGE__->config(
803         name => 'My Application',
804         root => '/home/joeuser/myapp/root'
805     );
806     
807     __PACKAGE__->setup;
808
809     sub end : Private {
810         my ( $self, $c ) = @_;
811         $c->stash->{template} ||= 'index.tt';
812         $c->forward('MyApp::View::TT');
813     }
814
815     sub view : Global {
816         my ( $self, $c, $id ) = @_;
817         $c->stash->{item} = MyApp::Model::CDBI::Foo->retrieve($id);
818     }
819
820     1;
821
822     # Then, in a TT template:
823     The id is [% item.data %]
824
825 Models do not have to be part of your Catalyst application; you
826 can always call an outside module that serves as your Model:
827
828     # in a Controller
829     sub list : Local {
830       my ( $self, $c ) = @_;
831       $c->stash->{template} = 'list.tt';
832       use Some::Outside::CDBI::Module;
833       my @records = Some::Outside::CDBI::Module->retrieve_all;
834       $c->stash->{records} = \@records;
835     }
836
837 But by using a Model that is part of your Catalyst application, you gain
838 several things: you don't have to C<use> each component, Catalyst will
839 find and load it automatically at compile-time; you can C<forward> to
840 the module, which can only be done to Catalyst components; and only
841 Catalyst components can be fetched with
842 C<$c-E<gt>model('SomeModel')>.
843
844 Happily, since many people have existing Model classes that they
845 would like to use with Catalyst (or, conversely, they want to
846 write Catalyst models that can be used outside of Catalyst, e.g.
847 in a cron job), it's trivial to write a simple component in
848 Catalyst that slurps in an outside Model:
849
850     package MyApp::Model::Catalog;
851     use base qw/Catalyst::Base Some::Other::CDBI::Module::Catalog/;
852     1;
853
854 and that's it! Now C<Some::Other::CDBI::Module::Catalog> is part of your
855 Cat app as C<MyApp::Model::Catalog>.
856
857 =head4 Controllers
858
859 Multiple controllers are a good way to separate logical domains of your
860 application.
861
862     package MyApp::Controller::Login;
863
864     sub sign-in : Local { }
865     sub new-password : Local { }
866     sub sign-out : Local { }
867
868     package MyApp::Controller::Catalog;
869
870     sub view : Local { }
871     sub list : Local { }
872
873     package MyApp::Controller::Cart;
874
875     sub add : Local { }
876     sub update : Local { }
877     sub order : Local { }
878
879 =head3 Testing
880
881 Catalyst has a built-in http server for testing! (Later, you can easily
882 use a more powerful server, e.g. Apache/mod_perl, in a production
883 environment.)
884
885 Start your application on the command line...
886
887     script/myapp_server.pl
888
889 ...then visit http://localhost:3000/ in a browser to view the output.
890
891 You can also do it all from the command line:
892
893     script/myapp_test.pl http://localhost/
894
895 Have fun!
896
897 =head1 SUPPORT
898
899 IRC:
900
901     Join #catalyst on irc.perl.org.
902
903 Mailing-lists:
904
905     http://lists.rawmode.org/mailman/listinfo/catalyst
906     http://lists.rawmode.org/mailman/listinfo/catalyst-dev
907
908 =head1 AUTHOR
909
910 Sebastian Riedel, C<sri@oook.de> 
911 David Naughton, C<naughton@umn.edu>
912 Marcus Ramberg, C<mramberg@cpan.org>
913 Jesse Sheidlower, C<jester@panix.com>
914 Danijel Milicevic, C<me@danijel.de>
915
916 =head1 COPYRIGHT
917
918 This program is free software, you can redistribute it and/or modify it under
919 the same terms as Perl itself.