bed30ee274fab24510b0b8999c32e3a712632c38
[catagits/Catalyst-Runtime.git] / lib / Catalyst.pm
1 package Catalyst;
2
3 use strict;
4 use base 'Catalyst::Component';
5 use bytes;
6 use Catalyst::Exception;
7 use Catalyst::Log;
8 use Catalyst::Request;
9 use Catalyst::Request::Upload;
10 use Catalyst::Response;
11 use Catalyst::Utils;
12 use Catalyst::Controller;
13 use Devel::InnerPackage ();
14 use File::stat;
15 use Module::Pluggable::Object ();
16 use NEXT;
17 use Text::SimpleTable ();
18 use Path::Class::Dir ();
19 use Path::Class::File ();
20 use Time::HiRes qw/gettimeofday tv_interval/;
21 use URI ();
22 use URI::http;
23 use URI::https;
24 use Scalar::Util qw/weaken blessed/;
25 use Tree::Simple qw/use_weak_refs/;
26 use Tree::Simple::Visitor::FindByUID;
27 use attributes;
28 use utf8;
29 use Carp qw/croak carp/;
30
31 BEGIN { require 5.008001; }
32
33 __PACKAGE__->mk_accessors(
34     qw/counter request response state action stack namespace stats/
35 );
36
37 sub depth { scalar @{ shift->stack || [] }; }
38
39 # Laziness++
40 *comp = \&component;
41 *req  = \&request;
42 *res  = \&response;
43
44 # For backwards compatibility
45 *finalize_output = \&finalize_body;
46
47 # For statistics
48 our $COUNT     = 1;
49 our $START     = time;
50 our $RECURSION = 1000;
51 our $DETACH    = "catalyst_detach\n";
52 our $GO        = "catalyst_go\n";
53
54 __PACKAGE__->mk_classdata($_)
55   for qw/components arguments dispatcher engine log dispatcher_class
56   engine_class context_class request_class response_class stats_class 
57   setup_finished/;
58
59 __PACKAGE__->dispatcher_class('Catalyst::Dispatcher');
60 __PACKAGE__->engine_class('Catalyst::Engine::CGI');
61 __PACKAGE__->request_class('Catalyst::Request');
62 __PACKAGE__->response_class('Catalyst::Response');
63 __PACKAGE__->stats_class('Catalyst::Stats');
64
65 # Remember to update this in Catalyst::Runtime as well!
66
67 our $VERSION = '5.7099_02';
68
69 sub import {
70     my ( $class, @arguments ) = @_;
71
72     # We have to limit $class to Catalyst to avoid pushing Catalyst upon every
73     # callers @ISA.
74     return unless $class eq 'Catalyst';
75
76     my $caller = caller(0);
77
78     unless ( $caller->isa('Catalyst') ) {
79         no strict 'refs';
80         push @{"$caller\::ISA"}, $class, 'Catalyst::Controller';
81     }
82
83     $caller->arguments( [@arguments] );
84     $caller->setup_home;
85 }
86
87 =head1 NAME
88
89 Catalyst - The Elegant MVC Web Application Framework
90
91 =head1 SYNOPSIS
92
93 See the L<Catalyst::Manual> distribution for comprehensive
94 documentation and tutorials.
95
96     # Install Catalyst::Devel for helpers and other development tools
97     # use the helper to create a new application
98     catalyst.pl MyApp
99
100     # add models, views, controllers
101     script/myapp_create.pl model MyDatabase DBIC::Schema create=dynamic dbi:SQLite:/path/to/db
102     script/myapp_create.pl view MyTemplate TT
103     script/myapp_create.pl controller Search
104
105     # built in testserver -- use -r to restart automatically on changes
106     # --help to see all available options
107     script/myapp_server.pl
108
109     # command line testing interface
110     script/myapp_test.pl /yada
111
112     ### in lib/MyApp.pm
113     use Catalyst qw/-Debug/; # include plugins here as well
114     
115     ### In lib/MyApp/Controller/Root.pm (autocreated)
116     sub foo : Global { # called for /foo, /foo/1, /foo/1/2, etc.
117         my ( $self, $c, @args ) = @_; # args are qw/1 2/ for /foo/1/2
118         $c->stash->{template} = 'foo.tt'; # set the template
119         # lookup something from db -- stash vars are passed to TT
120         $c->stash->{data} = 
121           $c->model('Database::Foo')->search( { country => $args[0] } );
122         if ( $c->req->params->{bar} ) { # access GET or POST parameters
123             $c->forward( 'bar' ); # process another action
124             # do something else after forward returns            
125         }
126     }
127     
128     # The foo.tt TT template can use the stash data from the database
129     [% WHILE (item = data.next) %]
130         [% item.foo %]
131     [% END %]
132     
133     # called for /bar/of/soap, /bar/of/soap/10, etc.
134     sub bar : Path('/bar/of/soap') { ... }
135
136     # called for all actions, from the top-most controller downwards
137     sub auto : Private { 
138         my ( $self, $c ) = @_;
139         if ( !$c->user_exists ) { # Catalyst::Plugin::Authentication
140             $c->res->redirect( '/login' ); # require login
141             return 0; # abort request and go immediately to end()
142         }
143         return 1; # success; carry on to next action
144     }
145     
146     # called after all actions are finished
147     sub end : Private { 
148         my ( $self, $c ) = @_;
149         if ( scalar @{ $c->error } ) { ... } # handle errors
150         return if $c->res->body; # already have a response
151         $c->forward( 'MyApp::View::TT' ); # render template
152     }
153
154     ### in MyApp/Controller/Foo.pm
155     # called for /foo/bar
156     sub bar : Local { ... }
157     
158     # called for /blargle
159     sub blargle : Global { ... }
160     
161     # an index action matches /foo, but not /foo/1, etc.
162     sub index : Private { ... }
163     
164     ### in MyApp/Controller/Foo/Bar.pm
165     # called for /foo/bar/baz
166     sub baz : Local { ... }
167     
168     # first Root auto is called, then Foo auto, then this
169     sub auto : Private { ... }
170     
171     # powerful regular expression paths are also possible
172     sub details : Regex('^product/(\w+)/details$') {
173         my ( $self, $c ) = @_;
174         # extract the (\w+) from the URI
175         my $product = $c->req->captures->[0];
176     }
177
178 See L<Catalyst::Manual::Intro> for additional information.
179
180 =head1 DESCRIPTION
181
182 Catalyst is a modern framework for making web applications without the
183 pain usually associated with this process. This document is a reference
184 to the main Catalyst application. If you are a new user, we suggest you
185 start with L<Catalyst::Manual::Tutorial> or L<Catalyst::Manual::Intro>.
186
187 See L<Catalyst::Manual> for more documentation.
188
189 Catalyst plugins can be loaded by naming them as arguments to the "use
190 Catalyst" statement. Omit the C<Catalyst::Plugin::> prefix from the
191 plugin name, i.e., C<Catalyst::Plugin::My::Module> becomes
192 C<My::Module>.
193
194     use Catalyst qw/My::Module/;
195
196 If your plugin starts with a name other than C<Catalyst::Plugin::>, you can
197 fully qualify the name by using a unary plus:
198
199     use Catalyst qw/
200         My::Module
201         +Fully::Qualified::Plugin::Name
202     /;
203
204 Special flags like C<-Debug> and C<-Engine> can also be specified as
205 arguments when Catalyst is loaded:
206
207     use Catalyst qw/-Debug My::Module/;
208
209 The position of plugins and flags in the chain is important, because
210 they are loaded in the order in which they appear.
211
212 The following flags are supported:
213
214 =head2 -Debug
215
216 Enables debug output. You can also force this setting from the system
217 environment with CATALYST_DEBUG or <MYAPP>_DEBUG. The environment
218 settings override the application, with <MYAPP>_DEBUG having the highest
219 priority.
220
221 =head2 -Engine
222
223 Forces Catalyst to use a specific engine. Omit the
224 C<Catalyst::Engine::> prefix of the engine name, i.e.:
225
226     use Catalyst qw/-Engine=CGI/;
227
228 =head2 -Home
229
230 Forces Catalyst to use a specific home directory, e.g.:
231
232     use Catalyst qw[-Home=/usr/mst];
233
234 This can also be done in the shell environment by setting either the
235 C<CATALYST_HOME> environment variable or C<MYAPP_HOME>; where C<MYAPP>
236 is replaced with the uppercased name of your application, any "::" in
237 the name will be replaced with underscores, e.g. MyApp::Web should use
238 MYAPP_WEB_HOME. If both variables are set, the MYAPP_HOME one will be used.
239
240 =head2 -Log
241
242 Specifies log level.
243
244 =head2 -Stats
245
246 Enables statistics collection and reporting. You can also force this setting
247 from the system environment with CATALYST_STATS or <MYAPP>_STATS. The
248 environment settings override the application, with <MYAPP>_STATS having the
249 highest priority.
250
251 e.g. 
252
253    use Catalyst qw/-Stats=1/
254
255 =head1 METHODS
256
257 =head2 INFORMATION ABOUT THE CURRENT REQUEST
258
259 =head2 $c->action
260
261 Returns a L<Catalyst::Action> object for the current action, which
262 stringifies to the action name. See L<Catalyst::Action>.
263
264 =head2 $c->namespace
265
266 Returns the namespace of the current action, i.e., the URI prefix
267 corresponding to the controller of the current action. For example:
268
269     # in Controller::Foo::Bar
270     $c->namespace; # returns 'foo/bar';
271
272 =head2 $c->request
273
274 =head2 $c->req
275
276 Returns the current L<Catalyst::Request> object, giving access to
277 information about the current client request (including parameters,
278 cookies, HTTP headers, etc.). See L<Catalyst::Request>.
279
280 =head2 REQUEST FLOW HANDLING
281
282 =head2 $c->forward( $action [, \@arguments ] )
283
284 =head2 $c->forward( $class, $method, [, \@arguments ] )
285
286 Forwards processing to another action, by its private name. If you give a
287 class name but no method, C<process()> is called. You may also optionally
288 pass arguments in an arrayref. The action will receive the arguments in
289 C<@_> and C<< $c->req->args >>. Upon returning from the function,
290 C<< $c->req->args >> will be restored to the previous values.
291
292 Any data C<return>ed from the action forwarded to, will be returned by the
293 call to forward.
294
295     my $foodata = $c->forward('/foo');
296     $c->forward('index');
297     $c->forward(qw/MyApp::Model::DBIC::Foo do_stuff/);
298     $c->forward('MyApp::View::TT');
299
300 Note that forward implies an C<<eval { }>> around the call (actually
301 C<execute> does), thus de-fatalizing all 'dies' within the called
302 action. If you want C<die> to propagate you need to do something like:
303
304     $c->forward('foo');
305     die $c->error if $c->error;
306
307 Or make sure to always return true values from your actions and write
308 your code like this:
309
310     $c->forward('foo') || return;
311
312 =cut
313
314 sub forward { my $c = shift; $c->dispatcher->forward( $c, @_ ) }
315
316 =head2 $c->detach( $action [, \@arguments ] )
317
318 =head2 $c->detach( $class, $method, [, \@arguments ] )
319
320 =head2 $c->detach()
321
322 The same as C<forward>, but doesn't return to the previous action when 
323 processing is finished. 
324
325 When called with no arguments it escapes the processing chain entirely.
326
327 =cut
328
329 sub detach { my $c = shift; $c->dispatcher->detach( $c, @_ ) }
330
331 =head2 $c->go( $action [, \@arguments ] )
332
333 =head2 $c->go( $class, $method, [, \@arguments ] )
334
335 Almost the same as C<detach>, but does a full dispatch, instead of just
336 calling the new C<$action> / C<$class-E<gt>$method>. This means that C<begin>,
337 C<auto> and the method you go to is called, just like a new request.
338
339 C<$c-E<gt>stash> is kept unchanged.
340
341 =cut
342
343 sub go { my $c = shift; $c->dispatcher->go( $c, @_ ) }
344
345 =head2 $c->response
346
347 =head2 $c->res
348
349 Returns the current L<Catalyst::Response> object, see there for details.
350
351 =head2 $c->stash
352
353 Returns a hashref to the stash, which may be used to store data and pass
354 it between components during a request. You can also set hash keys by
355 passing arguments. The stash is automatically sent to the view. The
356 stash is cleared at the end of a request; it cannot be used for
357 persistent storage (for this you must use a session; see
358 L<Catalyst::Plugin::Session> for a complete system integrated with
359 Catalyst).
360
361     $c->stash->{foo} = $bar;
362     $c->stash( { moose => 'majestic', qux => 0 } );
363     $c->stash( bar => 1, gorch => 2 ); # equivalent to passing a hashref
364     
365     # stash is automatically passed to the view for use in a template
366     $c->forward( 'MyApp::View::TT' );
367
368 =cut
369
370 sub stash {
371     my $c = shift;
372     if (@_) {
373         my $stash = @_ > 1 ? {@_} : $_[0];
374         croak('stash takes a hash or hashref') unless ref $stash;
375         foreach my $key ( keys %$stash ) {
376             $c->{stash}->{$key} = $stash->{$key};
377         }
378     }
379     return $c->{stash};
380 }
381
382 =head2 $c->error
383
384 =head2 $c->error($error, ...)
385
386 =head2 $c->error($arrayref)
387
388 Returns an arrayref containing error messages.  If Catalyst encounters an
389 error while processing a request, it stores the error in $c->error.  This
390 method should only be used to store fatal error messages.
391
392     my @error = @{ $c->error };
393
394 Add a new error.
395
396     $c->error('Something bad happened');
397
398 =cut
399
400 sub error {
401     my $c = shift;
402     if ( $_[0] ) {
403         my $error = ref $_[0] eq 'ARRAY' ? $_[0] : [@_];
404         croak @$error unless ref $c;
405         push @{ $c->{error} }, @$error;
406     }
407     elsif ( defined $_[0] ) { $c->{error} = undef }
408     return $c->{error} || [];
409 }
410
411
412 =head2 $c->state
413
414 Contains the return value of the last executed action.
415
416 =head2 $c->clear_errors
417
418 Clear errors.  You probably don't want to clear the errors unless you are
419 implementing a custom error screen.
420
421 This is equivalent to running
422
423     $c->error(0);
424
425 =cut
426
427 sub clear_errors {
428     my $c = shift;
429     $c->error(0);
430 }
431
432 # search components given a name and some prefixes
433 sub _comp_search_prefixes {
434     my ( $c, $name, @prefixes ) = @_;
435     my $appclass = ref $c || $c;
436     my $filter   = "^${appclass}::(" . join( '|', @prefixes ) . ')::';
437
438     # map the original component name to the sub part that we will search against
439     my %eligible = map { my $n = $_; $n =~ s{^$appclass\::[^:]+::}{}; $_ => $n; }
440         grep { /$filter/ } keys %{ $c->components };
441
442     # undef for a name will return all
443     return keys %eligible if !defined $name;
444
445     my $query  = ref $name ? $name : qr/^$name$/i;
446     my @result = grep { $eligible{$_} =~ m{$query} } keys %eligible;
447
448     return map { $c->components->{ $_ } } @result if @result;
449
450     # if we were given a regexp to search against, we're done.
451     return if ref $name;
452
453     # regexp fallback
454     $query  = qr/$name/i;
455     @result = map { $c->components->{ $_ } } grep { $eligible{ $_ } =~ m{$query} } keys %eligible;
456
457     # no results? try against full names
458     if( !@result ) {
459         @result = map { $c->components->{ $_ } } grep { m{$query} } keys %eligible;
460     }
461
462     # don't warn if we didn't find any results, it just might not exist
463     if( @result ) {
464         $c->log->warn( 'Relying on the regexp fallback behavior for component resolution is unreliable and unsafe.' );
465         $c->log->warn( 'If you really want to search, pass in a regexp as the argument.' );
466     }
467
468     return @result;
469 }
470
471 # Find possible names for a prefix 
472 sub _comp_names {
473     my ( $c, @prefixes ) = @_;
474     my $appclass = ref $c || $c;
475
476     my $filter = "^${appclass}::(" . join( '|', @prefixes ) . ')::';
477
478     my @names = map { s{$filter}{}; $_; } $c->_comp_search_prefixes( undef, @prefixes );
479     return @names;
480 }
481
482 # Filter a component before returning by calling ACCEPT_CONTEXT if available
483 sub _filter_component {
484     my ( $c, $comp, @args ) = @_;
485
486     if ( eval { $comp->can('ACCEPT_CONTEXT'); } ) {
487         return $comp->ACCEPT_CONTEXT( $c, @args );
488     }
489     
490     return $comp;
491 }
492
493 =head2 COMPONENT ACCESSORS
494
495 =head2 $c->controller($name)
496
497 Gets a L<Catalyst::Controller> instance by name.
498
499     $c->controller('Foo')->do_stuff;
500
501 If the name is omitted, will return the controller for the dispatched
502 action.
503
504 If you want to search for controllers, pass in a regexp as the argument.
505
506     # find all controllers that start with Foo
507     my @foo_controllers = $c->controller(qr{^Foo});
508
509
510 =cut
511
512 sub controller {
513     my ( $c, $name, @args ) = @_;
514
515     if( $name ) {
516         my @result = $c->_comp_search_prefixes( $name, qw/Controller C/ );
517         return map { $c->_filter_component( $_, @args ) } @result if ref $name;
518         return $c->_filter_component( $result[ 0 ], @args );
519     }
520
521     return $c->component( $c->action->class );
522 }
523
524 =head2 $c->model($name)
525
526 Gets a L<Catalyst::Model> instance by name.
527
528     $c->model('Foo')->do_stuff;
529
530 Any extra arguments are directly passed to ACCEPT_CONTEXT.
531
532 If the name is omitted, it will look for 
533  - a model object in $c->stash->{current_model_instance}, then
534  - a model name in $c->stash->{current_model}, then
535  - a config setting 'default_model', or
536  - check if there is only one model, and return it if that's the case.
537
538 If you want to search for models, pass in a regexp as the argument.
539
540     # find all models that start with Foo
541     my @foo_models = $c->model(qr{^Foo});
542
543 =cut
544
545 sub model {
546     my ( $c, $name, @args ) = @_;
547
548     if( $name ) {
549         my @result = $c->_comp_search_prefixes( $name, qw/Model M/ );
550         return map { $c->_filter_component( $_, @args ) } @result if ref $name;
551         return $c->_filter_component( $result[ 0 ], @args );
552     }
553
554     if (ref $c) {
555         return $c->stash->{current_model_instance} 
556           if $c->stash->{current_model_instance};
557         return $c->model( $c->stash->{current_model} )
558           if $c->stash->{current_model};
559     }
560     return $c->model( $c->config->{default_model} )
561       if $c->config->{default_model};
562
563     my( $comp, $rest ) = $c->_comp_search_prefixes( undef, qw/Model M/);
564
565     if( $rest ) {
566         $c->log->warn( 'Calling $c->model() will return a random model unless you specify one of:' );
567         $c->log->warn( '* $c->config->{default_model} # the name of the default model to use' );
568         $c->log->warn( '* $c->stash->{current_model} # the name of the model to use for this request' );
569         $c->log->warn( '* $c->stash->{current_model_instance} # the instance of the model to use for this request' );
570         $c->log->warn( 'NB: in version 5.80, the "random" behavior will not work at all.' );
571     }
572
573     return $c->_filter_component( $comp );
574 }
575
576
577 =head2 $c->view($name)
578
579 Gets a L<Catalyst::View> instance by name.
580
581     $c->view('Foo')->do_stuff;
582
583 Any extra arguments are directly passed to ACCEPT_CONTEXT.
584
585 If the name is omitted, it will look for 
586  - a view object in $c->stash->{current_view_instance}, then
587  - a view name in $c->stash->{current_view}, then
588  - a config setting 'default_view', or
589  - check if there is only one view, and return it if that's the case.
590
591 If you want to search for views, pass in a regexp as the argument.
592
593     # find all views that start with Foo
594     my @foo_views = $c->view(qr{^Foo});
595
596 =cut
597
598 sub view {
599     my ( $c, $name, @args ) = @_;
600
601     if( $name ) {
602         my @result = $c->_comp_search_prefixes( $name, qw/View V/ );
603         return map { $c->_filter_component( $_, @args ) } @result if ref $name;
604         return $c->_filter_component( $result[ 0 ], @args );
605     }
606
607     if (ref $c) {
608         return $c->stash->{current_view_instance} 
609           if $c->stash->{current_view_instance};
610         return $c->view( $c->stash->{current_view} )
611           if $c->stash->{current_view};
612     }
613     return $c->view( $c->config->{default_view} )
614       if $c->config->{default_view};
615
616     my( $comp, $rest ) = $c->_comp_search_prefixes( undef, qw/View V/);
617
618     if( $rest ) {
619         $c->log->warn( 'Calling $c->view() will return a random view unless you specify one of:' );
620         $c->log->warn( '* $c->config->{default_view} # the name of the default view to use' );
621         $c->log->warn( '* $c->stash->{current_view} # the name of the view to use for this request' );
622         $c->log->warn( '* $c->stash->{current_view_instance} # the instance of the view to use for this request' );
623         $c->log->warn( 'NB: in version 5.80, the "random" behavior will not work at all.' );
624     }
625
626     return $c->_filter_component( $comp );
627 }
628
629 =head2 $c->controllers
630
631 Returns the available names which can be passed to $c->controller
632
633 =cut
634
635 sub controllers {
636     my ( $c ) = @_;
637     return $c->_comp_names(qw/Controller C/);
638 }
639
640 =head2 $c->models
641
642 Returns the available names which can be passed to $c->model
643
644 =cut
645
646 sub models {
647     my ( $c ) = @_;
648     return $c->_comp_names(qw/Model M/);
649 }
650
651
652 =head2 $c->views
653
654 Returns the available names which can be passed to $c->view
655
656 =cut
657
658 sub views {
659     my ( $c ) = @_;
660     return $c->_comp_names(qw/View V/);
661 }
662
663 =head2 $c->comp($name)
664
665 =head2 $c->component($name)
666
667 Gets a component object by name. This method is not recommended,
668 unless you want to get a specific component by full
669 class. C<< $c->controller >>, C<< $c->model >>, and C<< $c->view >>
670 should be used instead.
671
672 If C<$name> is a regexp, a list of components matched against the full
673 component name will be returned.
674
675 =cut
676
677 sub component {
678     my ( $c, $name, @args ) = @_;
679
680     if( $name ) {
681         my $comps = $c->components;
682
683         if( !ref $name ) {
684             # is it the exact name?
685             return $comps->{ $name } if exists $comps->{ $name };
686
687             # perhaps we just omitted "MyApp"?
688             my $composed = ( ref $c || $c ) . "::${name}";
689             return $comps->{ $composed } if exists $comps->{ $composed };
690
691             # search all of the models, views and controllers
692             my( $comp ) = $c->_comp_search_prefixes( $name, qw/Model M Controller C View V/ );
693             return $c->_filter_component( $comp, @args ) if $comp;
694         }
695
696         # This is here so $c->comp( '::M::' ) works
697         my $query = ref $name ? $name : qr{$name}i;
698
699         my @result = grep { m{$query} } keys %{ $c->components };
700         return @result if ref $name;
701
702         if( $result[ 0 ] ) {
703             $c->log->warn( 'Relying on the regexp fallback behavior for component resolution' );
704             $c->log->warn( 'is unreliable and unsafe. You have been warned' );
705             return $result[ 0 ];
706         }
707
708         # I would expect to return an empty list here, but that breaks back-compat
709     }
710
711     # fallback
712     return sort keys %{ $c->components };
713 }
714
715 =head2 CLASS DATA AND HELPER CLASSES
716
717 =head2 $c->config
718
719 Returns or takes a hashref containing the application's configuration.
720
721     __PACKAGE__->config( { db => 'dsn:SQLite:foo.db' } );
722
723 You can also use a C<YAML>, C<XML> or C<Config::General> config file
724 like myapp.yml in your applications home directory. See
725 L<Catalyst::Plugin::ConfigLoader>.
726
727     ---
728     db: dsn:SQLite:foo.db
729
730
731 =cut
732
733 sub config {
734     my $c = shift;
735
736     $c->log->warn("Setting config after setup has been run is not a good idea.")
737       if ( @_ and $c->setup_finished );
738
739     $c->NEXT::config(@_);
740 }
741
742 =head2 $c->log
743
744 Returns the logging object instance. Unless it is already set, Catalyst
745 sets this up with a L<Catalyst::Log> object. To use your own log class,
746 set the logger with the C<< __PACKAGE__->log >> method prior to calling
747 C<< __PACKAGE__->setup >>.
748
749  __PACKAGE__->log( MyLogger->new );
750  __PACKAGE__->setup;
751
752 And later:
753
754     $c->log->info( 'Now logging with my own logger!' );
755
756 Your log class should implement the methods described in
757 L<Catalyst::Log>.
758
759
760 =head2 $c->debug
761
762 Overload to enable debug messages (same as -Debug option).
763
764 Note that this is a static method, not an accessor and should be overloaded
765 by declaring "sub debug { 1 }" in your MyApp.pm, not by calling $c->debug(1).
766
767 =cut
768
769 sub debug { 0 }
770
771 =head2 $c->dispatcher
772
773 Returns the dispatcher instance. Stringifies to class name. See
774 L<Catalyst::Dispatcher>.
775
776 =head2 $c->engine
777
778 Returns the engine instance. Stringifies to the class name. See
779 L<Catalyst::Engine>.
780
781
782 =head2 UTILITY METHODS
783
784 =head2 $c->path_to(@path)
785
786 Merges C<@path> with C<< $c->config->{home} >> and returns a
787 L<Path::Class::Dir> object.
788
789 For example:
790
791     $c->path_to( 'db', 'sqlite.db' );
792
793 =cut
794
795 sub path_to {
796     my ( $c, @path ) = @_;
797     my $path = Path::Class::Dir->new( $c->config->{home}, @path );
798     if ( -d $path ) { return $path }
799     else { return Path::Class::File->new( $c->config->{home}, @path ) }
800 }
801
802 =head2 $c->plugin( $name, $class, @args )
803
804 Helper method for plugins. It creates a classdata accessor/mutator and
805 loads and instantiates the given class.
806
807     MyApp->plugin( 'prototype', 'HTML::Prototype' );
808
809     $c->prototype->define_javascript_functions;
810
811 =cut
812
813 sub plugin {
814     my ( $class, $name, $plugin, @args ) = @_;
815     $class->_register_plugin( $plugin, 1 );
816
817     eval { $plugin->import };
818     $class->mk_classdata($name);
819     my $obj;
820     eval { $obj = $plugin->new(@args) };
821
822     if ($@) {
823         Catalyst::Exception->throw( message =>
824               qq/Couldn't instantiate instant plugin "$plugin", "$@"/ );
825     }
826
827     $class->$name($obj);
828     $class->log->debug(qq/Initialized instant plugin "$plugin" as "$name"/)
829       if $class->debug;
830 }
831
832 =head2 MyApp->setup
833
834 Initializes the dispatcher and engine, loads any plugins, and loads the
835 model, view, and controller components. You may also specify an array
836 of plugins to load here, if you choose to not load them in the C<use
837 Catalyst> line.
838
839     MyApp->setup;
840     MyApp->setup( qw/-Debug/ );
841
842 =cut
843
844 sub setup {
845     my ( $class, @arguments ) = @_;
846
847     $class->log->warn("Running setup twice is not a good idea.")
848       if ( $class->setup_finished );
849
850     unless ( $class->isa('Catalyst') ) {
851
852         Catalyst::Exception->throw(
853             message => qq/'$class' does not inherit from Catalyst/ );
854     }
855
856     if ( $class->arguments ) {
857         @arguments = ( @arguments, @{ $class->arguments } );
858     }
859
860     # Process options
861     my $flags = {};
862
863     foreach (@arguments) {
864
865         if (/^-Debug$/) {
866             $flags->{log} =
867               ( $flags->{log} ) ? 'debug,' . $flags->{log} : 'debug';
868         }
869         elsif (/^-(\w+)=?(.*)$/) {
870             $flags->{ lc $1 } = $2;
871         }
872         else {
873             push @{ $flags->{plugins} }, $_;
874         }
875     }
876
877     $class->setup_home( delete $flags->{home} );
878
879     $class->setup_log( delete $flags->{log} );
880     $class->setup_plugins( delete $flags->{plugins} );
881     $class->setup_dispatcher( delete $flags->{dispatcher} );
882     $class->setup_engine( delete $flags->{engine} );
883     $class->setup_stats( delete $flags->{stats} );
884
885     for my $flag ( sort keys %{$flags} ) {
886
887         if ( my $code = $class->can( 'setup_' . $flag ) ) {
888             &$code( $class, delete $flags->{$flag} );
889         }
890         else {
891             $class->log->warn(qq/Unknown flag "$flag"/);
892         }
893     }
894
895     eval { require Catalyst::Devel; };
896     if( !$@ && $ENV{CATALYST_SCRIPT_GEN} && ( $ENV{CATALYST_SCRIPT_GEN} < $Catalyst::Devel::CATALYST_SCRIPT_GEN ) ) {
897         $class->log->warn(<<"EOF");
898 You are running an old script!
899
900   Please update by running (this will overwrite existing files):
901     catalyst.pl -force -scripts $class
902
903   or (this will not overwrite existing files):
904     catalyst.pl -scripts $class
905
906 EOF
907     }
908     
909     if ( $class->debug ) {
910         my @plugins = map { "$_  " . ( $_->VERSION || '' ) } $class->registered_plugins;
911
912         if (@plugins) {
913             my $t = Text::SimpleTable->new(74);
914             $t->row($_) for @plugins;
915             $class->log->debug( "Loaded plugins:\n" . $t->draw . "\n" );
916         }
917
918         my $dispatcher = $class->dispatcher;
919         my $engine     = $class->engine;
920         my $home       = $class->config->{home};
921
922         $class->log->debug(qq/Loaded dispatcher "$dispatcher"/);
923         $class->log->debug(qq/Loaded engine "$engine"/);
924
925         $home
926           ? ( -d $home )
927           ? $class->log->debug(qq/Found home "$home"/)
928           : $class->log->debug(qq/Home "$home" doesn't exist/)
929           : $class->log->debug(q/Couldn't find home/);
930     }
931
932     # Call plugins setup
933     {
934         no warnings qw/redefine/;
935         local *setup = sub { };
936         $class->setup;
937     }
938
939     # Initialize our data structure
940     $class->components( {} );
941
942     $class->setup_components;
943
944     if ( $class->debug ) {
945         my $t = Text::SimpleTable->new( [ 63, 'Class' ], [ 8, 'Type' ] );
946         for my $comp ( sort keys %{ $class->components } ) {
947             my $type = ref $class->components->{$comp} ? 'instance' : 'class';
948             $t->row( $comp, $type );
949         }
950         $class->log->debug( "Loaded components:\n" . $t->draw . "\n" )
951           if ( keys %{ $class->components } );
952     }
953
954     # Add our self to components, since we are also a component
955     $class->components->{$class} = $class;
956
957     $class->setup_actions;
958
959     if ( $class->debug ) {
960         my $name = $class->config->{name} || 'Application';
961         $class->log->info("$name powered by Catalyst $Catalyst::VERSION");
962     }
963     $class->log->_flush() if $class->log->can('_flush');
964
965     $class->setup_finished(1);
966 }
967
968 =head2 $c->uri_for( $path, @args?, \%query_values? )
969
970 Merges path with C<< $c->request->base >> for absolute URIs and with
971 C<< $c->namespace >> for relative URIs, then returns a normalized L<URI>
972 object. If any args are passed, they are added at the end of the path.
973 If the last argument to C<uri_for> is a hash reference, it is assumed to
974 contain GET parameter key/value pairs, which will be appended to the URI
975 in standard fashion.
976
977 Note that uri_for is destructive to the passed hashref.  Subsequent calls
978 with the same hashref may have unintended results.
979
980 Instead of C<$path>, you can also optionally pass a C<$action> object
981 which will be resolved to a path using
982 C<< $c->dispatcher->uri_for_action >>; if the first element of
983 C<@args> is an arrayref it is treated as a list of captures to be passed
984 to C<uri_for_action>.
985
986 =cut
987
988 sub uri_for {
989     my ( $c, $path, @args ) = @_;
990
991     if ( Scalar::Util::blessed($path) ) { # action object
992         my $captures = ( scalar @args && ref $args[0] eq 'ARRAY'
993                          ? shift(@args)
994                          : [] );
995         $path = $c->dispatcher->uri_for_action($path, $captures);
996         return undef unless defined($path);
997         $path = '/' if $path eq '';
998     }
999
1000     undef($path) if (defined $path && $path eq '');
1001
1002     my $params =
1003       ( scalar @args && ref $args[$#args] eq 'HASH' ? pop @args : {} );
1004
1005     carp "uri_for called with undef argument" if grep { ! defined $_ } @args;
1006     s/([^$URI::uric])/$URI::Escape::escapes{$1}/go for @args;
1007
1008     unshift(@args, $path);
1009
1010     unless (defined $path && $path =~ s!^/!!) { # in-place strip
1011         my $namespace = $c->namespace;
1012         if (defined $path) { # cheesy hack to handle path '../foo'
1013            $namespace =~ s{(?:^|/)[^/]+$}{} while $args[0] =~ s{^\.\./}{};
1014         }
1015         unshift(@args, $namespace || '');
1016     }
1017     
1018     # join args with '/', or a blank string
1019     my $args = join('/', grep { defined($_) } @args);
1020     $args =~ s/\?/%3F/g; # STUPID STUPID SPECIAL CASE
1021     $args =~ s!^/!!;
1022     my $base = $c->req->base;
1023     my $class = ref($base);
1024     $base =~ s{(?<!/)$}{/};
1025
1026     my $query = '';
1027
1028     if (my @keys = keys %$params) {
1029       # somewhat lifted from URI::_query's query_form
1030       $query = '?'.join('&', map {
1031           my $val = $params->{$_};
1032           s/([;\/?:@&=+,\$\[\]%])/$URI::Escape::escapes{$1}/go;
1033           s/ /+/g;
1034           my $key = $_;
1035           $val = '' unless defined $val;
1036           (map {
1037               $_ = "$_";
1038               utf8::encode( $_ ) if utf8::is_utf8($_);
1039               # using the URI::Escape pattern here so utf8 chars survive
1040               s/([^A-Za-z0-9\-_.!~*'() ])/$URI::Escape::escapes{$1}/go;
1041               s/ /+/g;
1042               "${key}=$_"; } ( ref $val eq 'ARRAY' ? @$val : $val ));
1043       } @keys);
1044     }
1045
1046     my $res = bless(\"${base}${args}${query}", $class);
1047     $res;
1048 }
1049
1050 =head2 $c->welcome_message
1051
1052 Returns the Catalyst welcome HTML page.
1053
1054 =cut
1055
1056 sub welcome_message {
1057     my $c      = shift;
1058     my $name   = $c->config->{name};
1059     my $logo   = $c->uri_for('/static/images/catalyst_logo.png');
1060     my $prefix = Catalyst::Utils::appprefix( ref $c );
1061     $c->response->content_type('text/html; charset=utf-8');
1062     return <<"EOF";
1063 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
1064     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
1065 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
1066     <head>
1067     <meta http-equiv="Content-Language" content="en" />
1068     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
1069         <title>$name on Catalyst $VERSION</title>
1070         <style type="text/css">
1071             body {
1072                 color: #000;
1073                 background-color: #eee;
1074             }
1075             div#content {
1076                 width: 640px;
1077                 margin-left: auto;
1078                 margin-right: auto;
1079                 margin-top: 10px;
1080                 margin-bottom: 10px;
1081                 text-align: left;
1082                 background-color: #ccc;
1083                 border: 1px solid #aaa;
1084             }
1085             p, h1, h2 {
1086                 margin-left: 20px;
1087                 margin-right: 20px;
1088                 font-family: verdana, tahoma, sans-serif;
1089             }
1090             a {
1091                 font-family: verdana, tahoma, sans-serif;
1092             }
1093             :link, :visited {
1094                     text-decoration: none;
1095                     color: #b00;
1096                     border-bottom: 1px dotted #bbb;
1097             }
1098             :link:hover, :visited:hover {
1099                     color: #555;
1100             }
1101             div#topbar {
1102                 margin: 0px;
1103             }
1104             pre {
1105                 margin: 10px;
1106                 padding: 8px;
1107             }
1108             div#answers {
1109                 padding: 8px;
1110                 margin: 10px;
1111                 background-color: #fff;
1112                 border: 1px solid #aaa;
1113             }
1114             h1 {
1115                 font-size: 0.9em;
1116                 font-weight: normal;
1117                 text-align: center;
1118             }
1119             h2 {
1120                 font-size: 1.0em;
1121             }
1122             p {
1123                 font-size: 0.9em;
1124             }
1125             p img {
1126                 float: right;
1127                 margin-left: 10px;
1128             }
1129             span#appname {
1130                 font-weight: bold;
1131                 font-size: 1.6em;
1132             }
1133         </style>
1134     </head>
1135     <body>
1136         <div id="content">
1137             <div id="topbar">
1138                 <h1><span id="appname">$name</span> on <a href="http://catalyst.perl.org">Catalyst</a>
1139                     $VERSION</h1>
1140              </div>
1141              <div id="answers">
1142                  <p>
1143                  <img src="$logo" alt="Catalyst Logo" />
1144                  </p>
1145                  <p>Welcome to the  world of Catalyst.
1146                     This <a href="http://en.wikipedia.org/wiki/MVC">MVC</a>
1147                     framework will make web development something you had
1148                     never expected it to be: Fun, rewarding, and quick.</p>
1149                  <h2>What to do now?</h2>
1150                  <p>That really depends  on what <b>you</b> want to do.
1151                     We do, however, provide you with a few starting points.</p>
1152                  <p>If you want to jump right into web development with Catalyst
1153                     you might want to start with a tutorial.</p>
1154 <pre>perldoc <a href="http://cpansearch.perl.org/dist/Catalyst-Manual/lib/Catalyst/Manual/Tutorial.pod">Catalyst::Manual::Tutorial</a></code>
1155 </pre>
1156 <p>Afterwards you can go on to check out a more complete look at our features.</p>
1157 <pre>
1158 <code>perldoc <a href="http://cpansearch.perl.org/dist/Catalyst-Manual/lib/Catalyst/Manual/Intro.pod">Catalyst::Manual::Intro</a>
1159 <!-- Something else should go here, but the Catalyst::Manual link seems unhelpful -->
1160 </code></pre>
1161                  <h2>What to do next?</h2>
1162                  <p>Next it's time to write an actual application. Use the
1163                     helper scripts to generate <a href="http://cpansearch.perl.org/search?query=Catalyst%3A%3AController%3A%3A&amp;mode=all">controllers</a>,
1164                     <a href="http://cpansearch.perl.org/search?query=Catalyst%3A%3AModel%3A%3A&amp;mode=all">models</a>, and
1165                     <a href="http://cpansearch.perl.org/search?query=Catalyst%3A%3AView%3A%3A&amp;mode=all">views</a>;
1166                     they can save you a lot of work.</p>
1167                     <pre><code>script/${prefix}_create.pl -help</code></pre>
1168                     <p>Also, be sure to check out the vast and growing
1169                     collection of <a href="http://cpansearch.perl.org/search?query=Catalyst%3A%3APlugin%3A%3A&amp;mode=all">plugins for Catalyst on CPAN</a>;
1170                     you are likely to find what you need there.
1171                     </p>
1172
1173                  <h2>Need help?</h2>
1174                  <p>Catalyst has a very active community. Here are the main places to
1175                     get in touch with us.</p>
1176                  <ul>
1177                      <li>
1178                          <a href="http://dev.catalyst.perl.org">Wiki</a>
1179                      </li>
1180                      <li>
1181                          <a href="http://lists.rawmode.org/mailman/listinfo/catalyst">Mailing-List</a>
1182                      </li>
1183                      <li>
1184                          <a href="irc://irc.perl.org/catalyst">IRC channel #catalyst on irc.perl.org</a>
1185                      </li>
1186                  </ul>
1187                  <h2>In conclusion</h2>
1188                  <p>The Catalyst team hopes you will enjoy using Catalyst as much 
1189                     as we enjoyed making it. Please contact us if you have ideas
1190                     for improvement or other feedback.</p>
1191              </div>
1192          </div>
1193     </body>
1194 </html>
1195 EOF
1196 }
1197
1198 =head1 INTERNAL METHODS
1199
1200 These methods are not meant to be used by end users.
1201
1202 =head2 $c->components
1203
1204 Returns a hash of components.
1205
1206 =head2 $c->context_class
1207
1208 Returns or sets the context class.
1209
1210 =head2 $c->counter
1211
1212 Returns a hashref containing coderefs and execution counts (needed for
1213 deep recursion detection).
1214
1215 =head2 $c->depth
1216
1217 Returns the number of actions on the current internal execution stack.
1218
1219 =head2 $c->dispatch
1220
1221 Dispatches a request to actions.
1222
1223 =cut
1224
1225 sub dispatch { my $c = shift; $c->dispatcher->dispatch( $c, @_ ) }
1226
1227 =head2 $c->dispatcher_class
1228
1229 Returns or sets the dispatcher class.
1230
1231 =head2 $c->dump_these
1232
1233 Returns a list of 2-element array references (name, structure) pairs
1234 that will be dumped on the error page in debug mode.
1235
1236 =cut
1237
1238 sub dump_these {
1239     my $c = shift;
1240     [ Request => $c->req ], 
1241     [ Response => $c->res ], 
1242     [ Stash => $c->stash ],
1243     [ Config => $c->config ];
1244 }
1245
1246 =head2 $c->engine_class
1247
1248 Returns or sets the engine class.
1249
1250 =head2 $c->execute( $class, $coderef )
1251
1252 Execute a coderef in given class and catch exceptions. Errors are available
1253 via $c->error.
1254
1255 =cut
1256
1257 sub execute {
1258     my ( $c, $class, $code ) = @_;
1259     $class = $c->component($class) || $class;
1260     $c->state(0);
1261
1262     if ( $c->depth >= $RECURSION ) {
1263         my $action = "$code";
1264         $action = "/$action" unless $action =~ /->/;
1265         my $error = qq/Deep recursion detected calling "$action"/;
1266         $c->log->error($error);
1267         $c->error($error);
1268         $c->state(0);
1269         return $c->state;
1270     }
1271
1272     my $stats_info = $c->_stats_start_execute( $code ) if $c->use_stats;
1273
1274     push( @{ $c->stack }, $code );
1275     
1276     eval { $c->state( &$code( $class, $c, @{ $c->req->args } ) || 0 ) };
1277
1278     $c->_stats_finish_execute( $stats_info ) if $c->use_stats and $stats_info;
1279     
1280     my $last = pop( @{ $c->stack } );
1281
1282     if ( my $error = $@ ) {
1283         if ( !ref($error) and $error eq $DETACH ) {
1284             die $DETACH if($c->depth > 1);
1285         }
1286         elsif ( !ref($error) and $error eq $GO ) {
1287             die $GO if($c->depth > 0);
1288         }
1289         else {
1290             unless ( ref $error ) {
1291                 no warnings 'uninitialized';
1292                 chomp $error;
1293                 my $class = $last->class;
1294                 my $name  = $last->name;
1295                 $error = qq/Caught exception in $class->$name "$error"/;
1296             }
1297             $c->error($error);
1298             $c->state(0);
1299         }
1300     }
1301     return $c->state;
1302 }
1303
1304 sub _stats_start_execute {
1305     my ( $c, $code ) = @_;
1306
1307     return if ( ( $code->name =~ /^_.*/ )
1308         && ( !$c->config->{show_internal_actions} ) );
1309
1310     $c->counter->{"$code"}++;
1311
1312     my $action = "$code";
1313     $action = "/$action" unless $action =~ /->/;
1314
1315     # determine if the call was the result of a forward
1316     # this is done by walking up the call stack and looking for a calling
1317     # sub of Catalyst::forward before the eval
1318     my $callsub = q{};
1319     for my $index ( 2 .. 11 ) {
1320         last
1321         if ( ( caller($index) )[0] eq 'Catalyst'
1322             && ( caller($index) )[3] eq '(eval)' );
1323
1324         if ( ( caller($index) )[3] =~ /forward$/ ) {
1325             $callsub = ( caller($index) )[3];
1326             $action  = "-> $action";
1327             last;
1328         }
1329     }
1330
1331     my $uid = "$code" . $c->counter->{"$code"};
1332
1333     # is this a root-level call or a forwarded call?
1334     if ( $callsub =~ /forward$/ ) {
1335
1336         # forward, locate the caller
1337         if ( my $parent = $c->stack->[-1] ) {
1338             $c->stats->profile(
1339                 begin  => $action, 
1340                 parent => "$parent" . $c->counter->{"$parent"},
1341                 uid    => $uid,
1342             );
1343         }
1344         else {
1345
1346             # forward with no caller may come from a plugin
1347             $c->stats->profile(
1348                 begin => $action,
1349                 uid   => $uid,
1350             );
1351         }
1352     }
1353     else {
1354         
1355         # root-level call
1356         $c->stats->profile(
1357             begin => $action,
1358             uid   => $uid,
1359         );
1360     }
1361     return $action;
1362
1363 }
1364
1365 sub _stats_finish_execute {
1366     my ( $c, $info ) = @_;
1367     $c->stats->profile( end => $info );
1368 }
1369
1370 =head2 $c->_localize_fields( sub { }, \%keys );
1371
1372 =cut
1373
1374 sub _localize_fields {
1375     my ( $c, $localized, $code ) = ( @_ );
1376
1377     my $request = delete $localized->{request} || {};
1378     my $response = delete $localized->{response} || {};
1379     
1380     local @{ $c }{ keys %$localized } = values %$localized;
1381     local @{ $c->request }{ keys %$request } = values %$request;
1382     local @{ $c->response }{ keys %$response } = values %$response;
1383
1384     $code->();
1385 }
1386
1387 =head2 $c->finalize
1388
1389 Finalizes the request.
1390
1391 =cut
1392
1393 sub finalize {
1394     my $c = shift;
1395
1396     for my $error ( @{ $c->error } ) {
1397         $c->log->error($error);
1398     }
1399
1400     # Allow engine to handle finalize flow (for POE)
1401     if ( $c->engine->can('finalize') ) {
1402         $c->engine->finalize($c);
1403     }
1404     else {
1405
1406         $c->finalize_uploads;
1407
1408         # Error
1409         if ( $#{ $c->error } >= 0 ) {
1410             $c->finalize_error;
1411         }
1412
1413         $c->finalize_headers;
1414
1415         # HEAD request
1416         if ( $c->request->method eq 'HEAD' ) {
1417             $c->response->body('');
1418         }
1419
1420         $c->finalize_body;
1421     }
1422     
1423     if ($c->use_stats) {        
1424         my $elapsed = sprintf '%f', $c->stats->elapsed;
1425         my $av = $elapsed == 0 ? '??' : sprintf '%.3f', 1 / $elapsed;
1426         $c->log->info(
1427             "Request took ${elapsed}s ($av/s)\n" . $c->stats->report . "\n" );        
1428     }
1429
1430     return $c->response->status;
1431 }
1432
1433 =head2 $c->finalize_body
1434
1435 Finalizes body.
1436
1437 =cut
1438
1439 sub finalize_body { my $c = shift; $c->engine->finalize_body( $c, @_ ) }
1440
1441 =head2 $c->finalize_cookies
1442
1443 Finalizes cookies.
1444
1445 =cut
1446
1447 sub finalize_cookies { my $c = shift; $c->engine->finalize_cookies( $c, @_ ) }
1448
1449 =head2 $c->finalize_error
1450
1451 Finalizes error.
1452
1453 =cut
1454
1455 sub finalize_error { my $c = shift; $c->engine->finalize_error( $c, @_ ) }
1456
1457 =head2 $c->finalize_headers
1458
1459 Finalizes headers.
1460
1461 =cut
1462
1463 sub finalize_headers {
1464     my $c = shift;
1465
1466     # Check if we already finalized headers
1467     return if $c->response->{_finalized_headers};
1468
1469     # Handle redirects
1470     if ( my $location = $c->response->redirect ) {
1471         $c->log->debug(qq/Redirecting to "$location"/) if $c->debug;
1472         $c->response->header( Location => $location );
1473         
1474         if ( !$c->response->body ) {
1475             # Add a default body if none is already present
1476             $c->response->body(
1477                 qq{<html><body><p>This item has moved <a href="$location">here</a>.</p></body></html>}
1478             );
1479         }
1480     }
1481
1482     # Content-Length
1483     if ( $c->response->body && !$c->response->content_length ) {
1484
1485         # get the length from a filehandle
1486         if ( blessed( $c->response->body ) && $c->response->body->can('read') )
1487         {
1488             my $stat = stat $c->response->body;
1489             if ( $stat && $stat->size > 0 ) {
1490                 $c->response->content_length( $stat->size );
1491             }
1492             else {
1493                 $c->log->warn('Serving filehandle without a content-length');
1494             }
1495         }
1496         else {
1497             # everything should be bytes at this point, but just in case
1498             $c->response->content_length( bytes::length( $c->response->body ) );
1499         }
1500     }
1501
1502     # Errors
1503     if ( $c->response->status =~ /^(1\d\d|[23]04)$/ ) {
1504         $c->response->headers->remove_header("Content-Length");
1505         $c->response->body('');
1506     }
1507
1508     $c->finalize_cookies;
1509
1510     $c->engine->finalize_headers( $c, @_ );
1511
1512     # Done
1513     $c->response->{_finalized_headers} = 1;
1514 }
1515
1516 =head2 $c->finalize_output
1517
1518 An alias for finalize_body.
1519
1520 =head2 $c->finalize_read
1521
1522 Finalizes the input after reading is complete.
1523
1524 =cut
1525
1526 sub finalize_read { my $c = shift; $c->engine->finalize_read( $c, @_ ) }
1527
1528 =head2 $c->finalize_uploads
1529
1530 Finalizes uploads. Cleans up any temporary files.
1531
1532 =cut
1533
1534 sub finalize_uploads { my $c = shift; $c->engine->finalize_uploads( $c, @_ ) }
1535
1536 =head2 $c->get_action( $action, $namespace )
1537
1538 Gets an action in a given namespace.
1539
1540 =cut
1541
1542 sub get_action { my $c = shift; $c->dispatcher->get_action(@_) }
1543
1544 =head2 $c->get_actions( $action, $namespace )
1545
1546 Gets all actions of a given name in a namespace and all parent
1547 namespaces.
1548
1549 =cut
1550
1551 sub get_actions { my $c = shift; $c->dispatcher->get_actions( $c, @_ ) }
1552
1553 =head2 $c->handle_request( $class, @arguments )
1554
1555 Called to handle each HTTP request.
1556
1557 =cut
1558
1559 sub handle_request {
1560     my ( $class, @arguments ) = @_;
1561
1562     # Always expect worst case!
1563     my $status = -1;
1564     eval {
1565         if ($class->debug) {
1566             my $secs = time - $START || 1;
1567             my $av = sprintf '%.3f', $COUNT / $secs;
1568             my $time = localtime time;
1569             $class->log->info("*** Request $COUNT ($av/s) [$$] [$time] ***");
1570         }
1571
1572         my $c = $class->prepare(@arguments);
1573         $c->dispatch;
1574         $status = $c->finalize;   
1575     };
1576
1577     if ( my $error = $@ ) {
1578         chomp $error;
1579         $class->log->error(qq/Caught exception in engine "$error"/);
1580     }
1581
1582     $COUNT++;
1583     $class->log->_flush() if $class->log->can('_flush');
1584     return $status;
1585 }
1586
1587 =head2 $c->prepare( @arguments )
1588
1589 Creates a Catalyst context from an engine-specific request (Apache, CGI,
1590 etc.).
1591
1592 =cut
1593
1594 sub prepare {
1595     my ( $class, @arguments ) = @_;
1596
1597     $class->context_class( ref $class || $class ) unless $class->context_class;
1598     my $c = $class->context_class->new(
1599         {
1600             counter => {},
1601             stack   => [],
1602             request => $class->request_class->new(
1603                 {
1604                     arguments        => [],
1605                     body_parameters  => {},
1606                     cookies          => {},
1607                     headers          => HTTP::Headers->new,
1608                     parameters       => {},
1609                     query_parameters => {},
1610                     secure           => 0,
1611                     captures         => [],
1612                     uploads          => {}
1613                 }
1614             ),
1615             response => $class->response_class->new(
1616                 {
1617                     body    => '',
1618                     cookies => {},
1619                     headers => HTTP::Headers->new(),
1620                     status  => 200
1621                 }
1622             ),
1623             stash => {},
1624             state => 0
1625         }
1626     );
1627
1628     $c->stats($class->stats_class->new)->enable($c->use_stats);
1629     if ( $c->debug ) {
1630         $c->res->headers->header( 'X-Catalyst' => $Catalyst::VERSION );            
1631     }
1632
1633     # For on-demand data
1634     $c->request->{_context}  = $c;
1635     $c->response->{_context} = $c;
1636     weaken( $c->request->{_context} );
1637     weaken( $c->response->{_context} );
1638
1639     # Allow engine to direct the prepare flow (for POE)
1640     if ( $c->engine->can('prepare') ) {
1641         $c->engine->prepare( $c, @arguments );
1642     }
1643     else {
1644         $c->prepare_request(@arguments);
1645         $c->prepare_connection;
1646         $c->prepare_query_parameters;
1647         $c->prepare_headers;
1648         $c->prepare_cookies;
1649         $c->prepare_path;
1650
1651         # Prepare the body for reading, either by prepare_body
1652         # or the user, if they are using $c->read
1653         $c->prepare_read;
1654         
1655         # Parse the body unless the user wants it on-demand
1656         unless ( $c->config->{parse_on_demand} ) {
1657             $c->prepare_body;
1658         }
1659     }
1660
1661     my $method  = $c->req->method  || '';
1662     my $path    = $c->req->path;
1663     $path       = '/' unless length $path;
1664     my $address = $c->req->address || '';
1665
1666     $c->log->debug(qq/"$method" request for "$path" from "$address"/)
1667       if $c->debug;
1668
1669     $c->prepare_action;
1670
1671     return $c;
1672 }
1673
1674 =head2 $c->prepare_action
1675
1676 Prepares action. See L<Catalyst::Dispatcher>.
1677
1678 =cut
1679
1680 sub prepare_action { my $c = shift; $c->dispatcher->prepare_action( $c, @_ ) }
1681
1682 =head2 $c->prepare_body
1683
1684 Prepares message body.
1685
1686 =cut
1687
1688 sub prepare_body {
1689     my $c = shift;
1690
1691     # Do we run for the first time?
1692     return if defined $c->request->{_body};
1693
1694     # Initialize on-demand data
1695     $c->engine->prepare_body( $c, @_ );
1696     $c->prepare_parameters;
1697     $c->prepare_uploads;
1698
1699     if ( $c->debug && keys %{ $c->req->body_parameters } ) {
1700         my $t = Text::SimpleTable->new( [ 35, 'Parameter' ], [ 36, 'Value' ] );
1701         for my $key ( sort keys %{ $c->req->body_parameters } ) {
1702             my $param = $c->req->body_parameters->{$key};
1703             my $value = defined($param) ? $param : '';
1704             $t->row( $key,
1705                 ref $value eq 'ARRAY' ? ( join ', ', @$value ) : $value );
1706         }
1707         $c->log->debug( "Body Parameters are:\n" . $t->draw );
1708     }
1709 }
1710
1711 =head2 $c->prepare_body_chunk( $chunk )
1712
1713 Prepares a chunk of data before sending it to L<HTTP::Body>.
1714
1715 See L<Catalyst::Engine>.
1716
1717 =cut
1718
1719 sub prepare_body_chunk {
1720     my $c = shift;
1721     $c->engine->prepare_body_chunk( $c, @_ );
1722 }
1723
1724 =head2 $c->prepare_body_parameters
1725
1726 Prepares body parameters.
1727
1728 =cut
1729
1730 sub prepare_body_parameters {
1731     my $c = shift;
1732     $c->engine->prepare_body_parameters( $c, @_ );
1733 }
1734
1735 =head2 $c->prepare_connection
1736
1737 Prepares connection.
1738
1739 =cut
1740
1741 sub prepare_connection {
1742     my $c = shift;
1743     $c->engine->prepare_connection( $c, @_ );
1744 }
1745
1746 =head2 $c->prepare_cookies
1747
1748 Prepares cookies.
1749
1750 =cut
1751
1752 sub prepare_cookies { my $c = shift; $c->engine->prepare_cookies( $c, @_ ) }
1753
1754 =head2 $c->prepare_headers
1755
1756 Prepares headers.
1757
1758 =cut
1759
1760 sub prepare_headers { my $c = shift; $c->engine->prepare_headers( $c, @_ ) }
1761
1762 =head2 $c->prepare_parameters
1763
1764 Prepares parameters.
1765
1766 =cut
1767
1768 sub prepare_parameters {
1769     my $c = shift;
1770     $c->prepare_body_parameters;
1771     $c->engine->prepare_parameters( $c, @_ );
1772 }
1773
1774 =head2 $c->prepare_path
1775
1776 Prepares path and base.
1777
1778 =cut
1779
1780 sub prepare_path { my $c = shift; $c->engine->prepare_path( $c, @_ ) }
1781
1782 =head2 $c->prepare_query_parameters
1783
1784 Prepares query parameters.
1785
1786 =cut
1787
1788 sub prepare_query_parameters {
1789     my $c = shift;
1790
1791     $c->engine->prepare_query_parameters( $c, @_ );
1792
1793     if ( $c->debug && keys %{ $c->request->query_parameters } ) {
1794         my $t = Text::SimpleTable->new( [ 35, 'Parameter' ], [ 36, 'Value' ] );
1795         for my $key ( sort keys %{ $c->req->query_parameters } ) {
1796             my $param = $c->req->query_parameters->{$key};
1797             my $value = defined($param) ? $param : '';
1798             $t->row( $key,
1799                 ref $value eq 'ARRAY' ? ( join ', ', @$value ) : $value );
1800         }
1801         $c->log->debug( "Query Parameters are:\n" . $t->draw );
1802     }
1803 }
1804
1805 =head2 $c->prepare_read
1806
1807 Prepares the input for reading.
1808
1809 =cut
1810
1811 sub prepare_read { my $c = shift; $c->engine->prepare_read( $c, @_ ) }
1812
1813 =head2 $c->prepare_request
1814
1815 Prepares the engine request.
1816
1817 =cut
1818
1819 sub prepare_request { my $c = shift; $c->engine->prepare_request( $c, @_ ) }
1820
1821 =head2 $c->prepare_uploads
1822
1823 Prepares uploads.
1824
1825 =cut
1826
1827 sub prepare_uploads {
1828     my $c = shift;
1829
1830     $c->engine->prepare_uploads( $c, @_ );
1831
1832     if ( $c->debug && keys %{ $c->request->uploads } ) {
1833         my $t = Text::SimpleTable->new(
1834             [ 12, 'Parameter' ],
1835             [ 26, 'Filename' ],
1836             [ 18, 'Type' ],
1837             [ 9,  'Size' ]
1838         );
1839         for my $key ( sort keys %{ $c->request->uploads } ) {
1840             my $upload = $c->request->uploads->{$key};
1841             for my $u ( ref $upload eq 'ARRAY' ? @{$upload} : ($upload) ) {
1842                 $t->row( $key, $u->filename, $u->type, $u->size );
1843             }
1844         }
1845         $c->log->debug( "File Uploads are:\n" . $t->draw );
1846     }
1847 }
1848
1849 =head2 $c->prepare_write
1850
1851 Prepares the output for writing.
1852
1853 =cut
1854
1855 sub prepare_write { my $c = shift; $c->engine->prepare_write( $c, @_ ) }
1856
1857 =head2 $c->request_class
1858
1859 Returns or sets the request class.
1860
1861 =head2 $c->response_class
1862
1863 Returns or sets the response class.
1864
1865 =head2 $c->read( [$maxlength] )
1866
1867 Reads a chunk of data from the request body. This method is designed to
1868 be used in a while loop, reading C<$maxlength> bytes on every call.
1869 C<$maxlength> defaults to the size of the request if not specified.
1870
1871 You have to set C<< MyApp->config->{parse_on_demand} >> to use this
1872 directly.
1873
1874 Warning: If you use read(), Catalyst will not process the body,
1875 so you will not be able to access POST parameters or file uploads via
1876 $c->request.  You must handle all body parsing yourself.
1877
1878 =cut
1879
1880 sub read { my $c = shift; return $c->engine->read( $c, @_ ) }
1881
1882 =head2 $c->run
1883
1884 Starts the engine.
1885
1886 =cut
1887
1888 sub run { my $c = shift; return $c->engine->run( $c, @_ ) }
1889
1890 =head2 $c->set_action( $action, $code, $namespace, $attrs )
1891
1892 Sets an action in a given namespace.
1893
1894 =cut
1895
1896 sub set_action { my $c = shift; $c->dispatcher->set_action( $c, @_ ) }
1897
1898 =head2 $c->setup_actions($component)
1899
1900 Sets up actions for a component.
1901
1902 =cut
1903
1904 sub setup_actions { my $c = shift; $c->dispatcher->setup_actions( $c, @_ ) }
1905
1906 =head2 $c->setup_components
1907
1908 Sets up components. Specify a C<setup_components> config option to pass
1909 additional options directly to L<Module::Pluggable>. To add additional
1910 search paths, specify a key named C<search_extra> as an array
1911 reference. Items in the array beginning with C<::> will have the
1912 application class name prepended to them.
1913
1914 All components found will also have any 
1915 L<Devel::InnerPackage|inner packages> loaded and set up as components.
1916 Note, that modules which are B<not> an I<inner package> of the main
1917 file namespace loaded will not be instantiated as components.
1918
1919 =cut
1920
1921 sub setup_components {
1922     my $class = shift;
1923
1924     my @paths   = qw( ::Controller ::C ::Model ::M ::View ::V );
1925     my $config  = $class->config->{ setup_components };
1926     my $extra   = delete $config->{ search_extra } || [];
1927     
1928     push @paths, @$extra;
1929         
1930     my $locator = Module::Pluggable::Object->new(
1931         search_path => [ map { s/^(?=::)/$class/; $_; } @paths ],
1932         %$config
1933     );
1934
1935     my @comps = sort { length $a <=> length $b } $locator->plugins;
1936     my %comps = map { $_ => 1 } @comps;
1937     
1938     for my $component ( @comps ) {
1939
1940         # We pass ignore_loaded here so that overlay files for (e.g.)
1941         # Model::DBI::Schema sub-classes are loaded - if it's in @comps
1942         # we know M::P::O found a file on disk so this is safe
1943
1944         Catalyst::Utils::ensure_class_loaded( $component, { ignore_loaded => 1 } );
1945
1946         my $module  = $class->setup_component( $component );
1947         my %modules = (
1948             $component => $module,
1949             map {
1950                 $_ => $class->setup_component( $_ )
1951             } grep { 
1952               not exists $comps{$_}
1953             } Devel::InnerPackage::list_packages( $component )
1954         );
1955         
1956         for my $key ( keys %modules ) {
1957             $class->components->{ $key } = $modules{ $key };
1958         }
1959     }
1960 }
1961
1962 =head2 $c->setup_component
1963
1964 =cut
1965
1966 sub setup_component {
1967     my( $class, $component ) = @_;
1968
1969     unless ( $component->can( 'COMPONENT' ) ) {
1970         return $component;
1971     }
1972
1973     my $suffix = Catalyst::Utils::class2classsuffix( $component );
1974     my $config = $class->config->{ $suffix } || {};
1975
1976     my $instance = eval { $component->COMPONENT( $class, $config ); };
1977
1978     if ( my $error = $@ ) {
1979         chomp $error;
1980         Catalyst::Exception->throw(
1981             message => qq/Couldn't instantiate component "$component", "$error"/
1982         );
1983     }
1984
1985     Catalyst::Exception->throw(
1986         message =>
1987         qq/Couldn't instantiate component "$component", "COMPONENT() didn't return an object-like value"/
1988     ) unless eval { $instance->can( 'can' ) };
1989
1990     return $instance;
1991 }
1992
1993 =head2 $c->setup_dispatcher
1994
1995 Sets up dispatcher.
1996
1997 =cut
1998
1999 sub setup_dispatcher {
2000     my ( $class, $dispatcher ) = @_;
2001
2002     if ($dispatcher) {
2003         $dispatcher = 'Catalyst::Dispatcher::' . $dispatcher;
2004     }
2005
2006     if ( my $env = Catalyst::Utils::env_value( $class, 'DISPATCHER' ) ) {
2007         $dispatcher = 'Catalyst::Dispatcher::' . $env;
2008     }
2009
2010     unless ($dispatcher) {
2011         $dispatcher = $class->dispatcher_class;
2012     }
2013
2014     unless (Class::Inspector->loaded($dispatcher)) {
2015         require Class::Inspector->filename($dispatcher);
2016     }
2017
2018     # dispatcher instance
2019     $class->dispatcher( $dispatcher->new );
2020 }
2021
2022 =head2 $c->setup_engine
2023
2024 Sets up engine.
2025
2026 =cut
2027
2028 sub setup_engine {
2029     my ( $class, $engine ) = @_;
2030
2031     if ($engine) {
2032         $engine = 'Catalyst::Engine::' . $engine;
2033     }
2034
2035     if ( my $env = Catalyst::Utils::env_value( $class, 'ENGINE' ) ) {
2036         $engine = 'Catalyst::Engine::' . $env;
2037     }
2038
2039     if ( $ENV{MOD_PERL} ) {
2040
2041         # create the apache method
2042         {
2043             no strict 'refs';
2044             *{"$class\::apache"} = sub { shift->engine->apache };
2045         }
2046
2047         my ( $software, $version ) =
2048           $ENV{MOD_PERL} =~ /^(\S+)\/(\d+(?:[\.\_]\d+)+)/;
2049
2050         $version =~ s/_//g;
2051         $version =~ s/(\.[^.]+)\./$1/g;
2052
2053         if ( $software eq 'mod_perl' ) {
2054
2055             if ( !$engine ) {
2056
2057                 if ( $version >= 1.99922 ) {
2058                     $engine = 'Catalyst::Engine::Apache2::MP20';
2059                 }
2060
2061                 elsif ( $version >= 1.9901 ) {
2062                     $engine = 'Catalyst::Engine::Apache2::MP19';
2063                 }
2064
2065                 elsif ( $version >= 1.24 ) {
2066                     $engine = 'Catalyst::Engine::Apache::MP13';
2067                 }
2068
2069                 else {
2070                     Catalyst::Exception->throw( message =>
2071                           qq/Unsupported mod_perl version: $ENV{MOD_PERL}/ );
2072                 }
2073
2074             }
2075
2076             # install the correct mod_perl handler
2077             if ( $version >= 1.9901 ) {
2078                 *handler = sub  : method {
2079                     shift->handle_request(@_);
2080                 };
2081             }
2082             else {
2083                 *handler = sub ($$) { shift->handle_request(@_) };
2084             }
2085
2086         }
2087
2088         elsif ( $software eq 'Zeus-Perl' ) {
2089             $engine = 'Catalyst::Engine::Zeus';
2090         }
2091
2092         else {
2093             Catalyst::Exception->throw(
2094                 message => qq/Unsupported mod_perl: $ENV{MOD_PERL}/ );
2095         }
2096     }
2097
2098     unless ($engine) {
2099         $engine = $class->engine_class;
2100     }
2101
2102     unless (Class::Inspector->loaded($engine)) {
2103         require Class::Inspector->filename($engine);
2104     }
2105
2106     # check for old engines that are no longer compatible
2107     my $old_engine;
2108     if ( $engine->isa('Catalyst::Engine::Apache')
2109         && !Catalyst::Engine::Apache->VERSION )
2110     {
2111         $old_engine = 1;
2112     }
2113
2114     elsif ( $engine->isa('Catalyst::Engine::Server::Base')
2115         && Catalyst::Engine::Server->VERSION le '0.02' )
2116     {
2117         $old_engine = 1;
2118     }
2119
2120     elsif ($engine->isa('Catalyst::Engine::HTTP::POE')
2121         && $engine->VERSION eq '0.01' )
2122     {
2123         $old_engine = 1;
2124     }
2125
2126     elsif ($engine->isa('Catalyst::Engine::Zeus')
2127         && $engine->VERSION eq '0.01' )
2128     {
2129         $old_engine = 1;
2130     }
2131
2132     if ($old_engine) {
2133         Catalyst::Exception->throw( message =>
2134               qq/Engine "$engine" is not supported by this version of Catalyst/
2135         );
2136     }
2137
2138     # engine instance
2139     $class->engine( $engine->new );
2140 }
2141
2142 =head2 $c->setup_home
2143
2144 Sets up the home directory.
2145
2146 =cut
2147
2148 sub setup_home {
2149     my ( $class, $home ) = @_;
2150
2151     if ( my $env = Catalyst::Utils::env_value( $class, 'HOME' ) ) {
2152         $home = $env;
2153     }
2154
2155     unless ($home) {
2156         $home = Catalyst::Utils::home($class);
2157     }
2158
2159     if ($home) {
2160         $class->config->{home} ||= $home;
2161         $class->config->{root} ||= Path::Class::Dir->new($home)->subdir('root');
2162     }
2163 }
2164
2165 =head2 $c->setup_log
2166
2167 Sets up log.
2168
2169 =cut
2170
2171 sub setup_log {
2172     my ( $class, $debug ) = @_;
2173
2174     unless ( $class->log ) {
2175         $class->log( Catalyst::Log->new );
2176     }
2177
2178     my $env_debug = Catalyst::Utils::env_value( $class, 'DEBUG' );
2179     if ( defined($env_debug) ? $env_debug : $debug ) {
2180         no strict 'refs';
2181         *{"$class\::debug"} = sub { 1 };
2182         $class->log->debug('Debug messages enabled');
2183     }
2184 }
2185
2186 =head2 $c->setup_plugins
2187
2188 Sets up plugins.
2189
2190 =cut
2191
2192 =head2 $c->setup_stats
2193
2194 Sets up timing statistics class.
2195
2196 =cut
2197
2198 sub setup_stats {
2199     my ( $class, $stats ) = @_;
2200
2201     Catalyst::Utils::ensure_class_loaded($class->stats_class);
2202
2203     my $env = Catalyst::Utils::env_value( $class, 'STATS' );
2204     if ( defined($env) ? $env : ($stats || $class->debug ) ) {
2205         no strict 'refs';
2206         *{"$class\::use_stats"} = sub { 1 };
2207         $class->log->debug('Statistics enabled');
2208     }
2209 }
2210
2211
2212 =head2 $c->registered_plugins 
2213
2214 Returns a sorted list of the plugins which have either been stated in the
2215 import list or which have been added via C<< MyApp->plugin(@args); >>.
2216
2217 If passed a given plugin name, it will report a boolean value indicating
2218 whether or not that plugin is loaded.  A fully qualified name is required if
2219 the plugin name does not begin with C<Catalyst::Plugin::>.
2220
2221  if ($c->registered_plugins('Some::Plugin')) {
2222      ...
2223  }
2224
2225 =cut
2226
2227 {
2228
2229     sub registered_plugins {
2230         my $proto = shift;
2231         return sort keys %{ $proto->_plugins } unless @_;
2232         my $plugin = shift;
2233         return 1 if exists $proto->_plugins->{$plugin};
2234         return exists $proto->_plugins->{"Catalyst::Plugin::$plugin"};
2235     }
2236
2237     sub _register_plugin {
2238         my ( $proto, $plugin, $instant ) = @_;
2239         my $class = ref $proto || $proto;
2240
2241         # no ignore_loaded here, the plugin may already have been
2242         # defined in memory and we don't want to error on "no file" if so
2243
2244         Catalyst::Utils::ensure_class_loaded( $plugin );
2245
2246         $proto->_plugins->{$plugin} = 1;
2247         unless ($instant) {
2248             no strict 'refs';
2249             unshift @{"$class\::ISA"}, $plugin;
2250         }
2251         return $class;
2252     }
2253
2254     sub setup_plugins {
2255         my ( $class, $plugins ) = @_;
2256
2257         $class->_plugins( {} ) unless $class->_plugins;
2258         $plugins ||= [];
2259         for my $plugin ( reverse @$plugins ) {
2260
2261             unless ( $plugin =~ s/\A\+// ) {
2262                 $plugin = "Catalyst::Plugin::$plugin";
2263             }
2264
2265             $class->_register_plugin($plugin);
2266         }
2267     }
2268 }
2269
2270 =head2 $c->stack
2271
2272 Returns an arrayref of the internal execution stack (actions that are
2273 currently executing).
2274
2275 =head2 $c->stats_class
2276
2277 Returns or sets the stats (timing statistics) class.
2278
2279 =head2 $c->use_stats
2280
2281 Returns 1 when stats collection is enabled.  Stats collection is enabled
2282 when the -Stats options is set, debug is on or when the <MYAPP>_STATS
2283 environment variable is set.
2284
2285 Note that this is a static method, not an accessor and should be overloaded
2286 by declaring "sub use_stats { 1 }" in your MyApp.pm, not by calling $c->use_stats(1).
2287
2288 =cut
2289
2290 sub use_stats { 0 }
2291
2292
2293 =head2 $c->write( $data )
2294
2295 Writes $data to the output stream. When using this method directly, you
2296 will need to manually set the C<Content-Length> header to the length of
2297 your output data, if known.
2298
2299 =cut
2300
2301 sub write {
2302     my $c = shift;
2303
2304     # Finalize headers if someone manually writes output
2305     $c->finalize_headers;
2306
2307     return $c->engine->write( $c, @_ );
2308 }
2309
2310 =head2 version
2311
2312 Returns the Catalyst version number. Mostly useful for "powered by"
2313 messages in template systems.
2314
2315 =cut
2316
2317 sub version { return $Catalyst::VERSION }
2318
2319 =head1 INTERNAL ACTIONS
2320
2321 Catalyst uses internal actions like C<_DISPATCH>, C<_BEGIN>, C<_AUTO>,
2322 C<_ACTION>, and C<_END>. These are by default not shown in the private
2323 action table, but you can make them visible with a config parameter.
2324
2325     MyApp->config->{show_internal_actions} = 1;
2326
2327 =head1 CASE SENSITIVITY
2328
2329 By default Catalyst is not case sensitive, so C<MyApp::C::FOO::Bar> is
2330 mapped to C</foo/bar>. You can activate case sensitivity with a config
2331 parameter.
2332
2333     MyApp->config->{case_sensitive} = 1;
2334
2335 This causes C<MyApp::C::Foo::Bar> to map to C</Foo/Bar>.
2336
2337 =head1 ON-DEMAND PARSER
2338
2339 The request body is usually parsed at the beginning of a request,
2340 but if you want to handle input yourself, you can enable on-demand
2341 parsing with a config parameter.
2342
2343     MyApp->config->{parse_on_demand} = 1;
2344     
2345 =head1 PROXY SUPPORT
2346
2347 Many production servers operate using the common double-server approach,
2348 with a lightweight frontend web server passing requests to a larger
2349 backend server. An application running on the backend server must deal
2350 with two problems: the remote user always appears to be C<127.0.0.1> and
2351 the server's hostname will appear to be C<localhost> regardless of the
2352 virtual host that the user connected through.
2353
2354 Catalyst will automatically detect this situation when you are running
2355 the frontend and backend servers on the same machine. The following
2356 changes are made to the request.
2357
2358     $c->req->address is set to the user's real IP address, as read from 
2359     the HTTP X-Forwarded-For header.
2360     
2361     The host value for $c->req->base and $c->req->uri is set to the real
2362     host, as read from the HTTP X-Forwarded-Host header.
2363
2364 Obviously, your web server must support these headers for this to work.
2365
2366 In a more complex server farm environment where you may have your
2367 frontend proxy server(s) on different machines, you will need to set a
2368 configuration option to tell Catalyst to read the proxied data from the
2369 headers.
2370
2371     MyApp->config->{using_frontend_proxy} = 1;
2372     
2373 If you do not wish to use the proxy support at all, you may set:
2374
2375     MyApp->config->{ignore_frontend_proxy} = 1;
2376
2377 =head1 THREAD SAFETY
2378
2379 Catalyst has been tested under Apache 2's threading C<mpm_worker>,
2380 C<mpm_winnt>, and the standalone forking HTTP server on Windows. We
2381 believe the Catalyst core to be thread-safe.
2382
2383 If you plan to operate in a threaded environment, remember that all other
2384 modules you are using must also be thread-safe. Some modules, most notably
2385 L<DBD::SQLite>, are not thread-safe.
2386
2387 =head1 SUPPORT
2388
2389 IRC:
2390
2391     Join #catalyst on irc.perl.org.
2392
2393 Mailing Lists:
2394
2395     http://lists.rawmode.org/mailman/listinfo/catalyst
2396     http://lists.rawmode.org/mailman/listinfo/catalyst-dev
2397
2398 Web:
2399
2400     http://catalyst.perl.org
2401
2402 Wiki:
2403
2404     http://dev.catalyst.perl.org
2405
2406 =head1 SEE ALSO
2407
2408 =head2 L<Task::Catalyst> - All you need to start with Catalyst
2409
2410 =head2 L<Catalyst::Manual> - The Catalyst Manual
2411
2412 =head2 L<Catalyst::Component>, L<Catalyst::Base> - Base classes for components
2413
2414 =head2 L<Catalyst::Engine> - Core engine
2415
2416 =head2 L<Catalyst::Log> - Log class.
2417
2418 =head2 L<Catalyst::Request> - Request object
2419
2420 =head2 L<Catalyst::Response> - Response object
2421
2422 =head2 L<Catalyst::Test> - The test suite.
2423
2424 =head1 PROJECT FOUNDER
2425
2426 sri: Sebastian Riedel <sri@cpan.org>
2427
2428 =head1 CONTRIBUTORS
2429
2430 abw: Andy Wardley
2431
2432 acme: Leon Brocard <leon@astray.com>
2433
2434 Andrew Bramble
2435
2436 Andrew Ford
2437
2438 Andrew Ruthven
2439
2440 andyg: Andy Grundman <andy@hybridized.org>
2441
2442 audreyt: Audrey Tang
2443
2444 bricas: Brian Cassidy <bricas@cpan.org>
2445
2446 chansen: Christian Hansen
2447
2448 chicks: Christopher Hicks
2449
2450 dkubb: Dan Kubb <dan.kubb-cpan@onautopilot.com>
2451
2452 Drew Taylor
2453
2454 esskar: Sascha Kiefer
2455
2456 fireartist: Carl Franks <cfranks@cpan.org>
2457
2458 gabb: Danijel Milicevic
2459
2460 Gary Ashton Jones
2461
2462 Geoff Richards
2463
2464 jcamacho: Juan Camacho
2465
2466 Jody Belka
2467
2468 Johan Lindstrom
2469
2470 jon: Jon Schutz <jjschutz@cpan.org>
2471
2472 marcus: Marcus Ramberg <mramberg@cpan.org>
2473
2474 miyagawa: Tatsuhiko Miyagawa <miyagawa@bulknews.net>
2475
2476 mst: Matt S. Trout <mst@shadowcatsystems.co.uk>
2477
2478 mugwump: Sam Vilain
2479
2480 naughton: David Naughton
2481
2482 ningu: David Kamholz <dkamholz@cpan.org>
2483
2484 nothingmuch: Yuval Kogman <nothingmuch@woobling.org>
2485
2486 numa: Dan Sully <daniel@cpan.org>
2487
2488 obra: Jesse Vincent
2489
2490 omega: Andreas Marienborg
2491
2492 phaylon: Robert Sedlacek <phaylon@dunkelheit.at>
2493
2494 sky: Arthur Bergman
2495
2496 the_jester: Jesse Sheidlower
2497
2498 Ulf Edvinsson
2499
2500 willert: Sebastian Willert <willert@cpan.org>
2501
2502 =head1 LICENSE
2503
2504 This library is free software, you can redistribute it and/or modify it under
2505 the same terms as Perl itself.
2506
2507 =cut
2508
2509 1;