subcontainer class for shortened syntax
[catagits/Catalyst-Runtime.git] / lib / Catalyst.pm
1 package Catalyst;
2
3 use Moose;
4 use Moose::Meta::Class ();
5 extends 'Catalyst::Component';
6 use Moose::Util qw/find_meta/;
7 use B::Hooks::EndOfScope ();
8 use Catalyst::Exception;
9 use Catalyst::Exception::Detach;
10 use Catalyst::Exception::Go;
11 use Catalyst::Log;
12 use Catalyst::Request;
13 use Catalyst::Request::Upload;
14 use Catalyst::Response;
15 use Catalyst::Utils;
16 use Catalyst::Controller;
17 use Data::OptList;
18 use Devel::InnerPackage ();
19 use File::stat;
20 use Module::Pluggable::Object ();
21 use Text::SimpleTable ();
22 use Path::Class::Dir ();
23 use Path::Class::File ();
24 use URI ();
25 use URI::http;
26 use URI::https;
27 use Tree::Simple qw/use_weak_refs/;
28 use Tree::Simple::Visitor::FindByUID;
29 use Class::C3::Adopt::NEXT;
30 use List::MoreUtils qw/uniq/;
31 use attributes;
32 use utf8;
33 use Carp qw/croak carp shortmess/;
34
35 BEGIN { require 5.008004; }
36
37 has stack => (is => 'ro', default => sub { [] });
38 has stash => (is => 'rw', default => sub { {} });
39 has state => (is => 'rw', default => 0);
40 has stats => (is => 'rw');
41 has action => (is => 'rw');
42 has counter => (is => 'rw', default => sub { {} });
43 has request => (is => 'rw', default => sub { $_[0]->request_class->new({}) }, required => 1, lazy => 1);
44 has response => (is => 'rw', default => sub { $_[0]->response_class->new({}) }, required => 1, lazy => 1);
45 has namespace => (is => 'rw');
46
47 sub depth { scalar @{ shift->stack || [] }; }
48 sub comp { shift->component(@_) }
49
50 sub req {
51     my $self = shift; return $self->request(@_);
52 }
53 sub res {
54     my $self = shift; return $self->response(@_);
55 }
56
57 # For backwards compatibility
58 sub finalize_output { shift->finalize_body(@_) };
59
60 # For statistics
61 our $COUNT     = 1;
62 our $START     = time;
63 our $RECURSION = 1000;
64 our $DETACH    = Catalyst::Exception::Detach->new;
65 our $GO        = Catalyst::Exception::Go->new;
66
67 #I imagine that very few of these really need to be class variables. if any.
68 #maybe we should just make them attributes with a default?
69 __PACKAGE__->mk_classdata($_)
70   for qw/container components arguments dispatcher engine log dispatcher_class
71   engine_class context_class request_class response_class stats_class
72   setup_finished/;
73
74 __PACKAGE__->dispatcher_class('Catalyst::Dispatcher');
75 __PACKAGE__->engine_class('Catalyst::Engine::CGI');
76 __PACKAGE__->request_class('Catalyst::Request');
77 __PACKAGE__->response_class('Catalyst::Response');
78 __PACKAGE__->stats_class('Catalyst::Stats');
79
80 # Remember to update this in Catalyst::Runtime as well!
81
82 our $VERSION = '5.80032';
83
84 sub import {
85     my ( $class, @arguments ) = @_;
86
87     # We have to limit $class to Catalyst to avoid pushing Catalyst upon every
88     # callers @ISA.
89     return unless $class eq 'Catalyst';
90
91     my $caller = caller();
92     return if $caller eq 'main';
93
94     my $meta = Moose::Meta::Class->initialize($caller);
95     unless ( $caller->isa('Catalyst') ) {
96         my @superclasses = ($meta->superclasses, $class, 'Catalyst::Controller');
97         $meta->superclasses(@superclasses);
98     }
99     # Avoid possible C3 issues if 'Moose::Object' is already on RHS of MyApp
100     $meta->superclasses(grep { $_ ne 'Moose::Object' } $meta->superclasses);
101
102     unless( $meta->has_method('meta') ){
103         if ($Moose::VERSION >= 1.15) {
104             $meta->_add_meta_method('meta');
105         }
106         else {
107             $meta->add_method(meta => sub { Moose::Meta::Class->initialize("${caller}") } );
108         }
109     }
110
111     $caller->arguments( [@arguments] );
112     $caller->setup_home;
113 }
114
115 sub _application { $_[0] }
116
117 =head1 NAME
118
119 Catalyst - The Elegant MVC Web Application Framework
120
121 =head1 SYNOPSIS
122
123 See the L<Catalyst::Manual> distribution for comprehensive
124 documentation and tutorials.
125
126     # Install Catalyst::Devel for helpers and other development tools
127     # use the helper to create a new application
128     catalyst.pl MyApp
129
130     # add models, views, controllers
131     script/myapp_create.pl model MyDatabase DBIC::Schema create=static dbi:SQLite:/path/to/db
132     script/myapp_create.pl view MyTemplate TT
133     script/myapp_create.pl controller Search
134
135     # built in testserver -- use -r to restart automatically on changes
136     # --help to see all available options
137     script/myapp_server.pl
138
139     # command line testing interface
140     script/myapp_test.pl /yada
141
142     ### in lib/MyApp.pm
143     use Catalyst qw/-Debug/; # include plugins here as well
144
145     ### In lib/MyApp/Controller/Root.pm (autocreated)
146     sub foo : Global { # called for /foo, /foo/1, /foo/1/2, etc.
147         my ( $self, $c, @args ) = @_; # args are qw/1 2/ for /foo/1/2
148         $c->stash->{template} = 'foo.tt'; # set the template
149         # lookup something from db -- stash vars are passed to TT
150         $c->stash->{data} =
151           $c->model('Database::Foo')->search( { country => $args[0] } );
152         if ( $c->req->params->{bar} ) { # access GET or POST parameters
153             $c->forward( 'bar' ); # process another action
154             # do something else after forward returns
155         }
156     }
157
158     # The foo.tt TT template can use the stash data from the database
159     [% WHILE (item = data.next) %]
160         [% item.foo %]
161     [% END %]
162
163     # called for /bar/of/soap, /bar/of/soap/10, etc.
164     sub bar : Path('/bar/of/soap') { ... }
165
166     # called for all actions, from the top-most controller downwards
167     sub auto : Private {
168         my ( $self, $c ) = @_;
169         if ( !$c->user_exists ) { # Catalyst::Plugin::Authentication
170             $c->res->redirect( '/login' ); # require login
171             return 0; # abort request and go immediately to end()
172         }
173         return 1; # success; carry on to next action
174     }
175
176     # called after all actions are finished
177     sub end : Private {
178         my ( $self, $c ) = @_;
179         if ( scalar @{ $c->error } ) { ... } # handle errors
180         return if $c->res->body; # already have a response
181         $c->forward( 'MyApp::View::TT' ); # render template
182     }
183
184     ### in MyApp/Controller/Foo.pm
185     # called for /foo/bar
186     sub bar : Local { ... }
187
188     # called for /blargle
189     sub blargle : Global { ... }
190
191     # an index action matches /foo, but not /foo/1, etc.
192     sub index : Private { ... }
193
194     ### in MyApp/Controller/Foo/Bar.pm
195     # called for /foo/bar/baz
196     sub baz : Local { ... }
197
198     # first Root auto is called, then Foo auto, then this
199     sub auto : Private { ... }
200
201     # powerful regular expression paths are also possible
202     sub details : Regex('^product/(\w+)/details$') {
203         my ( $self, $c ) = @_;
204         # extract the (\w+) from the URI
205         my $product = $c->req->captures->[0];
206     }
207
208 See L<Catalyst::Manual::Intro> for additional information.
209
210 =head1 DESCRIPTION
211
212 Catalyst is a modern framework for making web applications without the
213 pain usually associated with this process. This document is a reference
214 to the main Catalyst application. If you are a new user, we suggest you
215 start with L<Catalyst::Manual::Tutorial> or L<Catalyst::Manual::Intro>.
216
217 See L<Catalyst::Manual> for more documentation.
218
219 Catalyst plugins can be loaded by naming them as arguments to the "use
220 Catalyst" statement. Omit the C<Catalyst::Plugin::> prefix from the
221 plugin name, i.e., C<Catalyst::Plugin::My::Module> becomes
222 C<My::Module>.
223
224     use Catalyst qw/My::Module/;
225
226 If your plugin starts with a name other than C<Catalyst::Plugin::>, you can
227 fully qualify the name by using a unary plus:
228
229     use Catalyst qw/
230         My::Module
231         +Fully::Qualified::Plugin::Name
232     /;
233
234 Special flags like C<-Debug> and C<-Engine> can also be specified as
235 arguments when Catalyst is loaded:
236
237     use Catalyst qw/-Debug My::Module/;
238
239 The position of plugins and flags in the chain is important, because
240 they are loaded in the order in which they appear.
241
242 The following flags are supported:
243
244 =head2 -Debug
245
246 Enables debug output. You can also force this setting from the system
247 environment with CATALYST_DEBUG or <MYAPP>_DEBUG. The environment
248 settings override the application, with <MYAPP>_DEBUG having the highest
249 priority.
250
251 This sets the log level to 'debug' and enables full debug output on the
252 error screen. If you only want the latter, see L<< $c->debug >>.
253
254 =head2 -Engine
255
256 Forces Catalyst to use a specific engine. Omit the
257 C<Catalyst::Engine::> prefix of the engine name, i.e.:
258
259     use Catalyst qw/-Engine=CGI/;
260
261 =head2 -Home
262
263 Forces Catalyst to use a specific home directory, e.g.:
264
265     use Catalyst qw[-Home=/usr/mst];
266
267 This can also be done in the shell environment by setting either the
268 C<CATALYST_HOME> environment variable or C<MYAPP_HOME>; where C<MYAPP>
269 is replaced with the uppercased name of your application, any "::" in
270 the name will be replaced with underscores, e.g. MyApp::Web should use
271 MYAPP_WEB_HOME. If both variables are set, the MYAPP_HOME one will be used.
272
273 If none of these are set, Catalyst will attempt to automatically detect the
274 home directory. If you are working in a development envirnoment, Catalyst
275 will try and find the directory containing either Makefile.PL, Build.PL or
276 dist.ini. If the application has been installed into the system (i.e.
277 you have done C<make install>), then Catalyst will use the path to your
278 application module, without the .pm extension (ie, /foo/MyApp if your
279 application was installed at /foo/MyApp.pm)
280
281 =head2 -Log
282
283     use Catalyst '-Log=warn,fatal,error';
284
285 Specifies a comma-delimited list of log levels.
286
287 =head2 -Stats
288
289 Enables statistics collection and reporting.
290
291    use Catalyst qw/-Stats=1/;
292
293 You can also force this setting from the system environment with CATALYST_STATS
294 or <MYAPP>_STATS. The environment settings override the application, with
295 <MYAPP>_STATS having the highest priority.
296
297 Stats are also enabled if L<< debugging |/"-Debug" >> is enabled.
298
299 =head1 METHODS
300
301 =head2 INFORMATION ABOUT THE CURRENT REQUEST
302
303 =head2 $c->action
304
305 Returns a L<Catalyst::Action> object for the current action, which
306 stringifies to the action name. See L<Catalyst::Action>.
307
308 =head2 $c->namespace
309
310 Returns the namespace of the current action, i.e., the URI prefix
311 corresponding to the controller of the current action. For example:
312
313     # in Controller::Foo::Bar
314     $c->namespace; # returns 'foo/bar';
315
316 =head2 $c->request
317
318 =head2 $c->req
319
320 Returns the current L<Catalyst::Request> object, giving access to
321 information about the current client request (including parameters,
322 cookies, HTTP headers, etc.). See L<Catalyst::Request>.
323
324 =head2 REQUEST FLOW HANDLING
325
326 =head2 $c->forward( $action [, \@arguments ] )
327
328 =head2 $c->forward( $class, $method, [, \@arguments ] )
329
330 Forwards processing to another action, by its private name. If you give a
331 class name but no method, C<process()> is called. You may also optionally
332 pass arguments in an arrayref. The action will receive the arguments in
333 C<@_> and C<< $c->req->args >>. Upon returning from the function,
334 C<< $c->req->args >> will be restored to the previous values.
335
336 Any data C<return>ed from the action forwarded to, will be returned by the
337 call to forward.
338
339     my $foodata = $c->forward('/foo');
340     $c->forward('index');
341     $c->forward(qw/Model::DBIC::Foo do_stuff/);
342     $c->forward('View::TT');
343
344 Note that L<< forward|/"$c->forward( $action [, \@arguments ] )" >> implies
345 an C<< eval { } >> around the call (actually
346 L<< execute|/"$c->execute( $class, $coderef )" >> does), thus de-fatalizing
347 all 'dies' within the called action. If you want C<die> to propagate you
348 need to do something like:
349
350     $c->forward('foo');
351     die join "\n", @{ $c->error } if @{ $c->error };
352
353 Or make sure to always return true values from your actions and write
354 your code like this:
355
356     $c->forward('foo') || return;
357
358 Another note is that C<< $c->forward >> always returns a scalar because it
359 actually returns $c->state which operates in a scalar context.
360 Thus, something like:
361
362     return @array;
363
364 in an action that is forwarded to is going to return a scalar,
365 i.e. how many items are in that array, which is probably not what you want.
366 If you need to return an array then return a reference to it,
367 or stash it like so:
368
369     $c->stash->{array} = \@array;
370
371 and access it from the stash.
372
373 Keep in mind that the C<end> method used is that of the caller action. So a C<$c-E<gt>detach> inside a forwarded action would run the C<end> method from the original action requested.
374
375 =cut
376
377 sub forward { my $c = shift; no warnings 'recursion'; $c->dispatcher->forward( $c, @_ ) }
378
379 =head2 $c->detach( $action [, \@arguments ] )
380
381 =head2 $c->detach( $class, $method, [, \@arguments ] )
382
383 =head2 $c->detach()
384
385 The same as L<< forward|/"$c->forward( $action [, \@arguments ] )" >>, but
386 doesn't return to the previous action when processing is finished.
387
388 When called with no arguments it escapes the processing chain entirely.
389
390 =cut
391
392 sub detach { my $c = shift; $c->dispatcher->detach( $c, @_ ) }
393
394 =head2 $c->visit( $action [, \@captures, \@arguments ] )
395
396 =head2 $c->visit( $class, $method, [, \@captures, \@arguments ] )
397
398 Almost the same as L<< forward|/"$c->forward( $action [, \@arguments ] )" >>,
399 but does a full dispatch, instead of just calling the new C<$action> /
400 C<< $class->$method >>. This means that C<begin>, C<auto> and the method
401 you go to are called, just like a new request.
402
403 In addition both C<< $c->action >> and C<< $c->namespace >> are localized.
404 This means, for example, that C<< $c->action >> methods such as
405 L<name|Catalyst::Action/name>, L<class|Catalyst::Action/class> and
406 L<reverse|Catalyst::Action/reverse> return information for the visited action
407 when they are invoked within the visited action.  This is different from the
408 behavior of L<< forward|/"$c->forward( $action [, \@arguments ] )" >>, which
409 continues to use the $c->action object from the caller action even when
410 invoked from the callee.
411
412 C<< $c->stash >> is kept unchanged.
413
414 In effect, L<< visit|/"$c->visit( $action [, \@captures, \@arguments ] )" >>
415 allows you to "wrap" another action, just as it would have been called by
416 dispatching from a URL, while the analogous
417 L<< go|/"$c->go( $action [, \@captures, \@arguments ] )" >> allows you to
418 transfer control to another action as if it had been reached directly from a URL.
419
420 =cut
421
422 sub visit { my $c = shift; $c->dispatcher->visit( $c, @_ ) }
423
424 =head2 $c->go( $action [, \@captures, \@arguments ] )
425
426 =head2 $c->go( $class, $method, [, \@captures, \@arguments ] )
427
428 The relationship between C<go> and
429 L<< visit|/"$c->visit( $action [, \@captures, \@arguments ] )" >> is the same as
430 the relationship between
431 L<< forward|/"$c->forward( $class, $method, [, \@arguments ] )" >> and
432 L<< detach|/"$c->detach( $action [, \@arguments ] )" >>. Like C<< $c->visit >>,
433 C<< $c->go >> will perform a full dispatch on the specified action or method,
434 with localized C<< $c->action >> and C<< $c->namespace >>. Like C<detach>,
435 C<go> escapes the processing of the current request chain on completion, and
436 does not return to its caller.
437
438 @arguments are arguments to the final destination of $action. @captures are
439 arguments to the intermediate steps, if any, on the way to the final sub of
440 $action.
441
442 =cut
443
444 sub go { my $c = shift; $c->dispatcher->go( $c, @_ ) }
445
446 =head2 $c->response
447
448 =head2 $c->res
449
450 Returns the current L<Catalyst::Response> object, see there for details.
451
452 =head2 $c->stash
453
454 Returns a hashref to the stash, which may be used to store data and pass
455 it between components during a request. You can also set hash keys by
456 passing arguments. The stash is automatically sent to the view. The
457 stash is cleared at the end of a request; it cannot be used for
458 persistent storage (for this you must use a session; see
459 L<Catalyst::Plugin::Session> for a complete system integrated with
460 Catalyst).
461
462     $c->stash->{foo} = $bar;
463     $c->stash( { moose => 'majestic', qux => 0 } );
464     $c->stash( bar => 1, gorch => 2 ); # equivalent to passing a hashref
465
466     # stash is automatically passed to the view for use in a template
467     $c->forward( 'MyApp::View::TT' );
468
469 =cut
470
471 around stash => sub {
472     my $orig = shift;
473     my $c = shift;
474     my $stash = $orig->($c);
475     if (@_) {
476         my $new_stash = @_ > 1 ? {@_} : $_[0];
477         croak('stash takes a hash or hashref') unless ref $new_stash;
478         foreach my $key ( keys %$new_stash ) {
479           $stash->{$key} = $new_stash->{$key};
480         }
481     }
482
483     return $stash;
484 };
485
486
487 =head2 $c->error
488
489 =head2 $c->error($error, ...)
490
491 =head2 $c->error($arrayref)
492
493 Returns an arrayref containing error messages.  If Catalyst encounters an
494 error while processing a request, it stores the error in $c->error.  This
495 method should only be used to store fatal error messages.
496
497     my @error = @{ $c->error };
498
499 Add a new error.
500
501     $c->error('Something bad happened');
502
503 =cut
504
505 sub error {
506     my $c = shift;
507     if ( $_[0] ) {
508         my $error = ref $_[0] eq 'ARRAY' ? $_[0] : [@_];
509         croak @$error unless ref $c;
510         push @{ $c->{error} }, @$error;
511     }
512     elsif ( defined $_[0] ) { $c->{error} = undef }
513     return $c->{error} || [];
514 }
515
516
517 =head2 $c->state
518
519 Contains the return value of the last executed action.
520 Note that << $c->state >> operates in a scalar context which means that all
521 values it returns are scalar.
522
523 =head2 $c->clear_errors
524
525 Clear errors.  You probably don't want to clear the errors unless you are
526 implementing a custom error screen.
527
528 This is equivalent to running
529
530     $c->error(0);
531
532 =cut
533
534 sub clear_errors {
535     my $c = shift;
536     $c->error(0);
537 }
538
539 sub _find_component_regexp {
540     my ( $c, $container, $name, $args ) = @_;
541
542     return
543         if $c->config->{disable_component_resolution_regex_fallback} && !ref $name;
544
545     my $appclass = ref $c || $c;
546     my $prefix   = ucfirst $container->name;
547     my $p        = substr $prefix, 0, 1;
548
549     my $query = ref $name ? $name : qr{$name}i;
550     $query =~ s/^${appclass}::($p|$prefix):://i;
551
552     my @comps  = $container->get_service_list;
553     my @result = map {
554         $container->resolve( service => $_, parameters => { context => $args } )
555     } grep { m/$query/ } @comps;
556
557     if (!ref $name && $result[0]) {
558         $c->log->warn( Carp::shortmess(qq(Found results for "${name}" using regexp fallback)) );
559         $c->log->warn( 'Relying on the regexp fallback behavior for component resolution' );
560         $c->log->warn( 'is unreliable and unsafe. You have been warned' );
561         return $result[0];
562     }
563
564     return @result;
565 }
566
567 =head2 COMPONENT ACCESSORS
568
569 =head2 $c->controller($name)
570
571 Gets a L<Catalyst::Controller> instance by name.
572
573     $c->controller('Foo')->do_stuff;
574
575 If the name is omitted, will return the controller for the dispatched
576 action.
577
578 If you want to search for controllers, pass in a regexp as the argument.
579
580     # find all controllers that start with Foo
581     my @foo_controllers = $c->controller(qr{^Foo});
582
583
584 =cut
585
586 sub controller {
587     my ( $c, $name, @args ) = @_;
588     my $container = $c->container->get_sub_container('controller');
589     unshift @args, $c;
590
591     if( $name ) {
592         return $container->get_component($name, \@args)
593             if $container->has_service($name) && !ref $name;
594
595         return $c->_find_component_regexp( $container, $name, \@args );
596     }
597
598     return $c->component( $c->action->class );
599 }
600
601 =head2 $c->model($name)
602
603 Gets a L<Catalyst::Model> instance by name.
604
605     $c->model('Foo')->do_stuff;
606
607 Any extra arguments are directly passed to ACCEPT_CONTEXT.
608
609 If the name is omitted, it will look for
610  - a model object in $c->stash->{current_model_instance}, then
611  - a model name in $c->stash->{current_model}, then
612  - a config setting 'default_model', or
613  - check if there is only one model, and return it if that's the case.
614
615 If you want to search for models, pass in a regexp as the argument.
616
617     # find all models that start with Foo
618     my @foo_models = $c->model(qr{^Foo});
619
620 =cut
621
622 sub model {
623     my ( $c, $name, @args ) = @_;
624     my $appclass = ref($c) || $c;
625     my $container = $c->container->get_sub_container('model');
626     unshift @args, $c;
627
628     if( $name ) {
629         # Direct component hash lookup to avoid costly regexps
630         return $container->get_component($name, \@args)
631             if ( !ref $name && $container->has_service($name));
632
633         return $c->_find_component_regexp( $container, $name, \@args );
634     }
635
636     if (ref $c) {
637         return $c->stash->{current_model_instance}
638           if $c->stash->{current_model_instance};
639         return $c->model( $c->stash->{current_model} )
640           if $c->stash->{current_model};
641     }
642     return $c->model( $appclass->config->{default_model} )
643       if $appclass->config->{default_model};
644
645 # FIXME: will this still be mantained?
646     my( $comp, $rest ) = $container->get_service_list;
647
648     if( $rest ) {
649         $c->log->warn( Carp::shortmess('Calling $c->model() will return a random model unless you specify one of:') );
650         $c->log->warn( '* $c->config(default_model => "the name of the default model to use")' );
651         $c->log->warn( '* $c->stash->{current_model} # the name of the model to use for this request' );
652         $c->log->warn( '* $c->stash->{current_model_instance} # the instance of the model to use for this request' );
653         $c->log->warn( 'NB: in version 5.81, the "random" behavior will not work at all.' );
654     }
655
656     return $container->get_component( $comp, \@args );
657 }
658
659
660 =head2 $c->view($name)
661
662 Gets a L<Catalyst::View> instance by name.
663
664     $c->view('Foo')->do_stuff;
665
666 Any extra arguments are directly passed to ACCEPT_CONTEXT.
667
668 If the name is omitted, it will look for
669  - a view object in $c->stash->{current_view_instance}, then
670  - a view name in $c->stash->{current_view}, then
671  - a config setting 'default_view', or
672  - check if there is only one view, and return it if that's the case.
673
674 If you want to search for views, pass in a regexp as the argument.
675
676     # find all views that start with Foo
677     my @foo_views = $c->view(qr{^Foo});
678
679 =cut
680
681 sub view {
682     my ( $c, $name, @args ) = @_;
683     my $appclass = ref($c) || $c;
684     my $container = $c->container->get_sub_container('view');
685     unshift @args, $c;
686
687     if( $name ) {
688         if ( !ref $name ) { # Direct component hash lookup to avoid costly regexps
689             if ( $container->has_service($name) ) {
690                 return $container->get_component($name, \@args);
691             }
692             else {
693                 $c->log->warn( "Attempted to use view '$name', but does not exist" );
694             }
695         }
696
697         return $c->_find_component_regexp( $container, $name, \@args );
698     }
699
700     if (ref $c) {
701         return $c->stash->{current_view_instance}
702           if $c->stash->{current_view_instance};
703         return $c->view( $c->stash->{current_view} )
704           if $c->stash->{current_view};
705     }
706     return $c->view( $appclass->config->{default_view} )
707       if $appclass->config->{default_view};
708
709     my( $comp, $rest ) = $container->get_service_list;
710
711     if( $rest ) {
712         $c->log->warn( 'Calling $c->view() will return a random view unless you specify one of:' );
713         $c->log->warn( '* $c->config(default_view => "the name of the default view to use")' );
714         $c->log->warn( '* $c->stash->{current_view} # the name of the view to use for this request' );
715         $c->log->warn( '* $c->stash->{current_view_instance} # the instance of the view to use for this request' );
716         $c->log->warn( 'NB: in version 5.81, the "random" behavior will not work at all.' );
717     }
718
719     return $container->get_component( $comp, \@args );
720 }
721
722 =head2 $c->controllers
723
724 Returns the available names which can be passed to $c->controller
725
726 =cut
727
728 sub controllers {
729     my ( $c ) = @_;
730     return $c->container->get_sub_container('controller')->get_service_list;
731 }
732
733 =head2 $c->models
734
735 Returns the available names which can be passed to $c->model
736
737 =cut
738
739 sub models {
740     my ( $c ) = @_;
741     return $c->container->get_sub_container('model')->get_service_list;
742 }
743
744
745 =head2 $c->views
746
747 Returns the available names which can be passed to $c->view
748
749 =cut
750
751 sub views {
752     my ( $c ) = @_;
753     return $c->container->get_sub_container('view')->get_service_list;
754 }
755
756 =head2 $c->comp($name)
757
758 =head2 $c->component($name)
759
760 Gets a component object by name. This method is not recommended,
761 unless you want to get a specific component by full
762 class. C<< $c->controller >>, C<< $c->model >>, and C<< $c->view >>
763 should be used instead.
764
765 If C<$name> is a regexp, a list of components matched against the full
766 component name will be returned.
767
768 If Catalyst can't find a component by name, it will fallback to regex
769 matching by default. To disable this behaviour set
770 disable_component_resolution_regex_fallback to a true value.
771
772     __PACKAGE__->config( disable_component_resolution_regex_fallback => 1 );
773
774 =cut
775
776 sub component {
777     my ( $c, $component, @args ) = @_;
778     unshift @args, $c;
779
780     if ( $component ) {
781         my ($type, $name) = _get_component_type_name($component);
782
783         if ($type && $c->container->has_sub_container($type)) {
784             my $container = $c->container->get_sub_container($type);
785
786             if( !ref $component && $container->has_service($name) ) {
787                 return $container->get_component( $name, \@args );
788             }
789
790             return
791                 if $c->config->{disable_component_resolution_regex_fallback};
792
793             my $query      = qr{$name}i;
794             my @components = $container->get_service_list;
795             my @result     = grep { m{$query} } @components;
796
797             if (@result) {
798                 $c->log->warn( Carp::shortmess(qq(Found results for "${component}" using regexp fallback)) );
799                 $c->log->warn( 'Relying on the regexp fallback behavior for component resolution' );
800                 $c->log->warn( 'is unreliable and unsafe. You have been warned' );
801
802                 return $container->get_component( $result[0], \@args );
803             }
804         }
805
806         return
807             if $c->config->{disable_component_resolution_regex_fallback} && !ref $component;
808
809         # This is here so $c->comp( '::M::' ) works
810         my $query = ref $component ? $component : qr{$component}i;
811
812         for my $subcontainer_name (qw/model view controller/) {
813             my $subcontainer = $c->container->get_sub_container($subcontainer_name);
814             my @components   = $subcontainer->get_service_list;
815             my @result       = grep { m{$query} } @components;
816
817             if (@result) {
818                 return map { $subcontainer->get_component( $_, \@args ) } @result
819                     if ref $component;
820
821                 $c->log->warn( Carp::shortmess(qq(Found results for "${component}" using regexp fallback)) );
822                 $c->log->warn( 'Relying on the regexp fallback behavior for component resolution' );
823                 $c->log->warn( 'is unreliable and unsafe. You have been warned' );
824
825                 return $subcontainer->get_component( $result[0], \@args );
826             }
827         }
828
829         # I would expect to return an empty list here, but that breaks back-compat
830     }
831
832     # fallback
833     return sort keys %{ $c->components };
834 }
835
836 =head2 CLASS DATA AND HELPER CLASSES
837
838 =head2 $c->config
839
840 Returns or takes a hashref containing the application's configuration.
841
842     __PACKAGE__->config( { db => 'dsn:SQLite:foo.db' } );
843
844 You can also use a C<YAML>, C<XML> or L<Config::General> config file
845 like C<myapp.conf> in your applications home directory. See
846 L<Catalyst::Plugin::ConfigLoader>.
847
848 =head3 Cascading configuration
849
850 The config method is present on all Catalyst components, and configuration
851 will be merged when an application is started. Configuration loaded with
852 L<Catalyst::Plugin::ConfigLoader> takes precedence over other configuration,
853 followed by configuration in your top level C<MyApp> class. These two
854 configurations are merged, and then configuration data whose hash key matches a
855 component name is merged with configuration for that component.
856
857 The configuration for a component is then passed to the C<new> method when a
858 component is constructed.
859
860 For example:
861
862     MyApp->config({ 'Model::Foo' => { bar => 'baz', overrides => 'me' } });
863     MyApp::Model::Foo->config({ quux => 'frob', overrides => 'this' });
864
865 will mean that C<MyApp::Model::Foo> receives the following data when
866 constructed:
867
868     MyApp::Model::Foo->new({
869         bar => 'baz',
870         quux => 'frob',
871         overrides => 'me',
872     });
873
874 It's common practice to use a Moose attribute
875 on the receiving component to access the config value.
876
877     package MyApp::Model::Foo;
878
879     use Moose;
880
881     # this attr will receive 'baz' at construction time
882     has 'bar' => (
883         is  => 'rw',
884         isa => 'Str',
885     );
886
887 You can then get the value 'baz' by calling $c->model('Foo')->bar
888 (or $self->bar inside code in the model).
889
890 B<NOTE:> you MUST NOT call C<< $self->config >> or C<< __PACKAGE__->config >>
891 as a way of reading config within your code, as this B<will not> give you the
892 correctly merged config back. You B<MUST> take the config values supplied to
893 the constructor and use those instead.
894
895 =cut
896
897 around config => sub {
898     my $orig = shift;
899     my $c = shift;
900
901     croak('Setting config after setup has been run is not allowed.')
902         if ( @_ and $c->setup_finished );
903
904     $c->$orig(@_);
905 };
906
907 =head2 $c->log
908
909 Returns the logging object instance. Unless it is already set, Catalyst
910 sets this up with a L<Catalyst::Log> object. To use your own log class,
911 set the logger with the C<< __PACKAGE__->log >> method prior to calling
912 C<< __PACKAGE__->setup >>.
913
914  __PACKAGE__->log( MyLogger->new );
915  __PACKAGE__->setup;
916
917 And later:
918
919     $c->log->info( 'Now logging with my own logger!' );
920
921 Your log class should implement the methods described in
922 L<Catalyst::Log>.
923
924
925 =head2 $c->debug
926
927 Returns 1 if debug mode is enabled, 0 otherwise.
928
929 You can enable debug mode in several ways:
930
931 =over
932
933 =item By calling myapp_server.pl with the -d flag
934
935 =item With the environment variables MYAPP_DEBUG, or CATALYST_DEBUG
936
937 =item The -Debug option in your MyApp.pm
938
939 =item By declaring C<sub debug { 1 }> in your MyApp.pm.
940
941 =back
942
943 The first three also set the log level to 'debug'.
944
945 Calling C<< $c->debug(1) >> has no effect.
946
947 =cut
948
949 sub debug { 0 }
950
951 =head2 $c->dispatcher
952
953 Returns the dispatcher instance. See L<Catalyst::Dispatcher>.
954
955 =head2 $c->engine
956
957 Returns the engine instance. See L<Catalyst::Engine>.
958
959
960 =head2 UTILITY METHODS
961
962 =head2 $c->path_to(@path)
963
964 Merges C<@path> with C<< $c->config->{home} >> and returns a
965 L<Path::Class::Dir> object. Note you can usually use this object as
966 a filename, but sometimes you will have to explicitly stringify it
967 yourself by calling the C<< ->stringify >> method.
968
969 For example:
970
971     $c->path_to( 'db', 'sqlite.db' );
972
973 =cut
974
975 sub path_to {
976     my ( $c, @path ) = @_;
977     my $path = Path::Class::Dir->new( $c->config->{home}, @path );
978     if ( -d $path ) { return $path }
979     else { return Path::Class::File->new( $c->config->{home}, @path ) }
980 }
981
982 =head2 $c->plugin( $name, $class, @args )
983
984 Helper method for plugins. It creates a class data accessor/mutator and
985 loads and instantiates the given class.
986
987     MyApp->plugin( 'prototype', 'HTML::Prototype' );
988
989     $c->prototype->define_javascript_functions;
990
991 B<Note:> This method of adding plugins is deprecated. The ability
992 to add plugins like this B<will be removed> in a Catalyst 5.81.
993 Please do not use this functionality in new code.
994
995 =cut
996
997 sub plugin {
998     my ( $class, $name, $plugin, @args ) = @_;
999
1000     # See block comment in t/unit_core_plugin.t
1001     $class->log->warn(qq/Adding plugin using the ->plugin method is deprecated, and will be removed in Catalyst 5.81/);
1002
1003     $class->_register_plugin( $plugin, 1 );
1004
1005     eval { $plugin->import };
1006     $class->mk_classdata($name);
1007     my $obj;
1008     eval { $obj = $plugin->new(@args) };
1009
1010     if ($@) {
1011         Catalyst::Exception->throw( message =>
1012               qq/Couldn't instantiate instant plugin "$plugin", "$@"/ );
1013     }
1014
1015     $class->$name($obj);
1016     $class->log->debug(qq/Initialized instant plugin "$plugin" as "$name"/)
1017       if $class->debug;
1018 }
1019
1020 =head2 MyApp->setup
1021
1022 Initializes the dispatcher and engine, loads any plugins, and loads the
1023 model, view, and controller components. You may also specify an array
1024 of plugins to load here, if you choose to not load them in the C<use
1025 Catalyst> line.
1026
1027     MyApp->setup;
1028     MyApp->setup( qw/-Debug/ );
1029
1030 =cut
1031
1032 sub setup {
1033     my ( $class, @arguments ) = @_;
1034     croak('Running setup more than once')
1035         if ( $class->setup_finished );
1036
1037     unless ( $class->isa('Catalyst') ) {
1038
1039         Catalyst::Exception->throw(
1040             message => qq/'$class' does not inherit from Catalyst/ );
1041     }
1042
1043     if ( $class->arguments ) {
1044         @arguments = ( @arguments, @{ $class->arguments } );
1045     }
1046
1047     # Process options
1048     my $flags = {};
1049
1050     foreach (@arguments) {
1051
1052         if (/^-Debug$/) {
1053             $flags->{log} =
1054               ( $flags->{log} ) ? 'debug,' . $flags->{log} : 'debug';
1055         }
1056         elsif (/^-(\w+)=?(.*)$/) {
1057             $flags->{ lc $1 } = $2;
1058         }
1059         else {
1060             push @{ $flags->{plugins} }, $_;
1061         }
1062     }
1063
1064     $class->setup_config();
1065     $class->setup_home( delete $flags->{home} );
1066
1067     $class->setup_log( delete $flags->{log} );
1068     $class->setup_plugins( delete $flags->{plugins} );
1069     $class->setup_dispatcher( delete $flags->{dispatcher} );
1070     $class->setup_engine( delete $flags->{engine} );
1071     $class->setup_stats( delete $flags->{stats} );
1072
1073     for my $flag ( sort keys %{$flags} ) {
1074
1075         if ( my $code = $class->can( 'setup_' . $flag ) ) {
1076             &$code( $class, delete $flags->{$flag} );
1077         }
1078         else {
1079             $class->log->warn(qq/Unknown flag "$flag"/);
1080         }
1081     }
1082
1083     eval { require Catalyst::Devel; };
1084     if( !$@ && $ENV{CATALYST_SCRIPT_GEN} && ( $ENV{CATALYST_SCRIPT_GEN} < $Catalyst::Devel::CATALYST_SCRIPT_GEN ) ) {
1085         $class->log->warn(<<"EOF");
1086 You are running an old script!
1087
1088   Please update by running (this will overwrite existing files):
1089     catalyst.pl -force -scripts $class
1090
1091   or (this will not overwrite existing files):
1092     catalyst.pl -scripts $class
1093
1094 EOF
1095     }
1096
1097     if ( $class->debug ) {
1098         my @plugins = map { "$_  " . ( $_->VERSION || '' ) } $class->registered_plugins;
1099
1100         if (@plugins) {
1101             my $column_width = Catalyst::Utils::term_width() - 6;
1102             my $t = Text::SimpleTable->new($column_width);
1103             $t->row($_) for @plugins;
1104             $class->log->debug( "Loaded plugins:\n" . $t->draw . "\n" );
1105         }
1106
1107         my $dispatcher = $class->dispatcher;
1108         my $engine     = $class->engine;
1109         my $home       = $class->config->{home};
1110
1111         $class->log->debug(sprintf(q/Loaded dispatcher "%s"/, blessed($dispatcher)));
1112         $class->log->debug(sprintf(q/Loaded engine "%s"/, blessed($engine)));
1113
1114         $home
1115           ? ( -d $home )
1116           ? $class->log->debug(qq/Found home "$home"/)
1117           : $class->log->debug(qq/Home "$home" doesn't exist/)
1118           : $class->log->debug(q/Couldn't find home/);
1119     }
1120
1121     # Call plugins setup, this is stupid and evil.
1122     # Also screws C3 badly on 5.10, hack to avoid.
1123     {
1124         no warnings qw/redefine/;
1125         local *setup = sub { };
1126         $class->setup unless $Catalyst::__AM_RESTARTING;
1127     }
1128
1129     # Initialize our data structure
1130     $class->components( {} );
1131
1132     $class->setup_components;
1133
1134     if ( $class->debug ) {
1135         my $column_width = Catalyst::Utils::term_width() - 8 - 9;
1136         my $t = Text::SimpleTable->new( [ $column_width, 'Class' ], [ 8, 'Type' ] );
1137         for my $comp ( sort keys %{ $class->components } ) {
1138             my $type = ref $class->components->{$comp} ? 'instance' : 'class';
1139             $t->row( $comp, $type );
1140         }
1141         $class->log->debug( "Loaded components:\n" . $t->draw . "\n" )
1142           if ( keys %{ $class->components } );
1143     }
1144
1145     # Add our self to components, since we are also a component
1146     if( $class->isa('Catalyst::Controller') ){
1147       $class->components->{$class} = $class;
1148     }
1149
1150     $class->setup_actions;
1151
1152     if ( $class->debug ) {
1153         my $name = $class->config->{name} || 'Application';
1154         $class->log->info("$name powered by Catalyst $Catalyst::VERSION");
1155     }
1156
1157     # Make sure that the application class becomes immutable at this point,
1158     B::Hooks::EndOfScope::on_scope_end {
1159         return if $@;
1160         my $meta = Class::MOP::get_metaclass_by_name($class);
1161         if (
1162             $meta->is_immutable
1163             && ! { $meta->immutable_options }->{replace_constructor}
1164             && (
1165                    $class->isa('Class::Accessor::Fast')
1166                 || $class->isa('Class::Accessor')
1167             )
1168         ) {
1169             warn "You made your application class ($class) immutable, "
1170                 . "but did not inline the\nconstructor. "
1171                 . "This will break catalyst, as your app \@ISA "
1172                 . "Class::Accessor(::Fast)?\nPlease pass "
1173                 . "(replace_constructor => 1)\nwhen making your class immutable.\n";
1174         }
1175         $meta->make_immutable(
1176             replace_constructor => 1,
1177         ) unless $meta->is_immutable;
1178     };
1179
1180     if ($class->config->{case_sensitive}) {
1181         $class->log->warn($class . "->config->{case_sensitive} is set.");
1182         $class->log->warn("This setting is deprecated and planned to be removed in Catalyst 5.81.");
1183     }
1184
1185     $class->setup_finalize;
1186     # Should be the last thing we do so that user things hooking
1187     # setup_finalize can log..
1188     $class->log->_flush() if $class->log->can('_flush');
1189     return 1; # Explicit return true as people have __PACKAGE__->setup as the last thing in their class. HATE.
1190 }
1191
1192 =head2 $app->setup_finalize
1193
1194 A hook to attach modifiers to. This method does not do anything except set the
1195 C<setup_finished> accessor.
1196
1197 Applying method modifiers to the C<setup> method doesn't work, because of quirky things done for plugin setup.
1198
1199 Example:
1200
1201     after setup_finalize => sub {
1202         my $app = shift;
1203
1204         ## do stuff here..
1205     };
1206
1207 =cut
1208
1209 sub setup_finalize {
1210     my ($class) = @_;
1211     $class->setup_finished(1);
1212 }
1213
1214 =head2 $c->uri_for( $path?, @args?, \%query_values? )
1215
1216 =head2 $c->uri_for( $action, \@captures?, @args?, \%query_values? )
1217
1218 Constructs an absolute L<URI> object based on the application root, the
1219 provided path, and the additional arguments and query parameters provided.
1220 When used as a string, provides a textual URI.  If you need more flexibility
1221 than this (i.e. the option to provide relative URIs etc.) see
1222 L<Catalyst::Plugin::SmartURI>.
1223
1224 If no arguments are provided, the URI for the current action is returned.
1225 To return the current action and also provide @args, use
1226 C<< $c->uri_for( $c->action, @args ) >>.
1227
1228 If the first argument is a string, it is taken as a public URI path relative
1229 to C<< $c->namespace >> (if it doesn't begin with a forward slash) or
1230 relative to the application root (if it does). It is then merged with
1231 C<< $c->request->base >>; any C<@args> are appended as additional path
1232 components; and any C<%query_values> are appended as C<?foo=bar> parameters.
1233
1234 If the first argument is a L<Catalyst::Action> it represents an action which
1235 will have its path resolved using C<< $c->dispatcher->uri_for_action >>. The
1236 optional C<\@captures> argument (an arrayref) allows passing the captured
1237 variables that are needed to fill in the paths of Chained and Regex actions;
1238 once the path is resolved, C<uri_for> continues as though a path was
1239 provided, appending any arguments or parameters and creating an absolute
1240 URI.
1241
1242 The captures for the current request can be found in
1243 C<< $c->request->captures >>, and actions can be resolved using
1244 C<< Catalyst::Controller->action_for($name) >>. If you have a private action
1245 path, use C<< $c->uri_for_action >> instead.
1246
1247   # Equivalent to $c->req->uri
1248   $c->uri_for($c->action, $c->req->captures,
1249       @{ $c->req->args }, $c->req->params);
1250
1251   # For the Foo action in the Bar controller
1252   $c->uri_for($c->controller('Bar')->action_for('Foo'));
1253
1254   # Path to a static resource
1255   $c->uri_for('/static/images/logo.png');
1256
1257 =cut
1258
1259 sub uri_for {
1260     my ( $c, $path, @args ) = @_;
1261
1262     if (blessed($path) && $path->isa('Catalyst::Controller')) {
1263         $path = $path->path_prefix;
1264         $path =~ s{/+\z}{};
1265         $path .= '/';
1266     }
1267
1268     undef($path) if (defined $path && $path eq '');
1269
1270     my $params =
1271       ( scalar @args && ref $args[$#args] eq 'HASH' ? pop @args : {} );
1272
1273     carp "uri_for called with undef argument" if grep { ! defined $_ } @args;
1274     foreach my $arg (@args) {
1275         utf8::encode($arg) if utf8::is_utf8($arg);
1276         $arg =~ s/([^$URI::uric])/$URI::Escape::escapes{$1}/go;
1277     }
1278
1279     if ( blessed($path) ) { # action object
1280         s|/|%2F|g for @args;
1281         my $captures = [ map { s|/|%2F|g; $_; }
1282                         ( scalar @args && ref $args[0] eq 'ARRAY'
1283                          ? @{ shift(@args) }
1284                          : ()) ];
1285
1286         foreach my $capture (@$captures) {
1287             utf8::encode($capture) if utf8::is_utf8($capture);
1288             $capture =~ s/([^$URI::uric])/$URI::Escape::escapes{$1}/go;
1289         }
1290
1291         my $action = $path;
1292         $path = $c->dispatcher->uri_for_action($action, $captures);
1293         if (not defined $path) {
1294             $c->log->debug(qq/Can't find uri_for action '$action' @$captures/)
1295                 if $c->debug;
1296             return undef;
1297         }
1298         $path = '/' if $path eq '';
1299     }
1300
1301     unshift(@args, $path);
1302
1303     unless (defined $path && $path =~ s!^/!!) { # in-place strip
1304         my $namespace = $c->namespace;
1305         if (defined $path) { # cheesy hack to handle path '../foo'
1306            $namespace =~ s{(?:^|/)[^/]+$}{} while $args[0] =~ s{^\.\./}{};
1307         }
1308         unshift(@args, $namespace || '');
1309     }
1310
1311     # join args with '/', or a blank string
1312     my $args = join('/', grep { defined($_) } @args);
1313     $args =~ s/\?/%3F/g; # STUPID STUPID SPECIAL CASE
1314     $args =~ s!^/+!!;
1315     my $base = $c->req->base;
1316     my $class = ref($base);
1317     $base =~ s{(?<!/)$}{/};
1318
1319     my $query = '';
1320
1321     if (my @keys = keys %$params) {
1322       # somewhat lifted from URI::_query's query_form
1323       $query = '?'.join('&', map {
1324           my $val = $params->{$_};
1325           s/([;\/?:@&=+,\$\[\]%])/$URI::Escape::escapes{$1}/go;
1326           s/ /+/g;
1327           my $key = $_;
1328           $val = '' unless defined $val;
1329           (map {
1330               my $param = "$_";
1331               utf8::encode( $param ) if utf8::is_utf8($param);
1332               # using the URI::Escape pattern here so utf8 chars survive
1333               $param =~ s/([^A-Za-z0-9\-_.!~*'() ])/$URI::Escape::escapes{$1}/go;
1334               $param =~ s/ /+/g;
1335               "${key}=$param"; } ( ref $val eq 'ARRAY' ? @$val : $val ));
1336       } @keys);
1337     }
1338
1339     my $res = bless(\"${base}${args}${query}", $class);
1340     $res;
1341 }
1342
1343 =head2 $c->uri_for_action( $path, \@captures?, @args?, \%query_values? )
1344
1345 =head2 $c->uri_for_action( $action, \@captures?, @args?, \%query_values? )
1346
1347 =over
1348
1349 =item $path
1350
1351 A private path to the Catalyst action you want to create a URI for.
1352
1353 This is a shortcut for calling C<< $c->dispatcher->get_action_by_path($path)
1354 >> and passing the resulting C<$action> and the remaining arguments to C<<
1355 $c->uri_for >>.
1356
1357 You can also pass in a Catalyst::Action object, in which case it is passed to
1358 C<< $c->uri_for >>.
1359
1360 Note that although the path looks like a URI that dispatches to the wanted action, it is not a URI, but an internal path to that action.
1361
1362 For example, if the action looks like:
1363
1364  package MyApp::Controller::Users;
1365
1366  sub lst : Path('the-list') {}
1367
1368 You can use:
1369
1370  $c->uri_for_action('/users/lst')
1371
1372 and it will create the URI /users/the-list.
1373
1374 =back
1375
1376 =cut
1377
1378 sub uri_for_action {
1379     my ( $c, $path, @args ) = @_;
1380     my $action = blessed($path)
1381       ? $path
1382       : $c->dispatcher->get_action_by_path($path);
1383     unless (defined $action) {
1384       croak "Can't find action for path '$path'";
1385     }
1386     return $c->uri_for( $action, @args );
1387 }
1388
1389 =head2 $c->welcome_message
1390
1391 Returns the Catalyst welcome HTML page.
1392
1393 =cut
1394
1395 sub welcome_message {
1396     my $c      = shift;
1397     my $name   = $c->config->{name};
1398     my $logo   = $c->uri_for('/static/images/catalyst_logo.png');
1399     my $prefix = Catalyst::Utils::appprefix( ref $c );
1400     $c->response->content_type('text/html; charset=utf-8');
1401     return <<"EOF";
1402 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
1403     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
1404 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
1405     <head>
1406     <meta http-equiv="Content-Language" content="en" />
1407     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
1408         <title>$name on Catalyst $VERSION</title>
1409         <style type="text/css">
1410             body {
1411                 color: #000;
1412                 background-color: #eee;
1413             }
1414             div#content {
1415                 width: 640px;
1416                 margin-left: auto;
1417                 margin-right: auto;
1418                 margin-top: 10px;
1419                 margin-bottom: 10px;
1420                 text-align: left;
1421                 background-color: #ccc;
1422                 border: 1px solid #aaa;
1423             }
1424             p, h1, h2 {
1425                 margin-left: 20px;
1426                 margin-right: 20px;
1427                 font-family: verdana, tahoma, sans-serif;
1428             }
1429             a {
1430                 font-family: verdana, tahoma, sans-serif;
1431             }
1432             :link, :visited {
1433                     text-decoration: none;
1434                     color: #b00;
1435                     border-bottom: 1px dotted #bbb;
1436             }
1437             :link:hover, :visited:hover {
1438                     color: #555;
1439             }
1440             div#topbar {
1441                 margin: 0px;
1442             }
1443             pre {
1444                 margin: 10px;
1445                 padding: 8px;
1446             }
1447             div#answers {
1448                 padding: 8px;
1449                 margin: 10px;
1450                 background-color: #fff;
1451                 border: 1px solid #aaa;
1452             }
1453             h1 {
1454                 font-size: 0.9em;
1455                 font-weight: normal;
1456                 text-align: center;
1457             }
1458             h2 {
1459                 font-size: 1.0em;
1460             }
1461             p {
1462                 font-size: 0.9em;
1463             }
1464             p img {
1465                 float: right;
1466                 margin-left: 10px;
1467             }
1468             span#appname {
1469                 font-weight: bold;
1470                 font-size: 1.6em;
1471             }
1472         </style>
1473     </head>
1474     <body>
1475         <div id="content">
1476             <div id="topbar">
1477                 <h1><span id="appname">$name</span> on <a href="http://catalyst.perl.org">Catalyst</a>
1478                     $VERSION</h1>
1479              </div>
1480              <div id="answers">
1481                  <p>
1482                  <img src="$logo" alt="Catalyst Logo" />
1483                  </p>
1484                  <p>Welcome to the  world of Catalyst.
1485                     This <a href="http://en.wikipedia.org/wiki/MVC">MVC</a>
1486                     framework will make web development something you had
1487                     never expected it to be: Fun, rewarding, and quick.</p>
1488                  <h2>What to do now?</h2>
1489                  <p>That really depends  on what <b>you</b> want to do.
1490                     We do, however, provide you with a few starting points.</p>
1491                  <p>If you want to jump right into web development with Catalyst
1492                     you might want to start with a tutorial.</p>
1493 <pre>perldoc <a href="http://cpansearch.perl.org/dist/Catalyst-Manual/lib/Catalyst/Manual/Tutorial.pod">Catalyst::Manual::Tutorial</a></code>
1494 </pre>
1495 <p>Afterwards you can go on to check out a more complete look at our features.</p>
1496 <pre>
1497 <code>perldoc <a href="http://cpansearch.perl.org/dist/Catalyst-Manual/lib/Catalyst/Manual/Intro.pod">Catalyst::Manual::Intro</a>
1498 <!-- Something else should go here, but the Catalyst::Manual link seems unhelpful -->
1499 </code></pre>
1500                  <h2>What to do next?</h2>
1501                  <p>Next it's time to write an actual application. Use the
1502                     helper scripts to generate <a href="http://cpansearch.perl.org/search?query=Catalyst%3A%3AController%3A%3A&amp;mode=all">controllers</a>,
1503                     <a href="http://cpansearch.perl.org/search?query=Catalyst%3A%3AModel%3A%3A&amp;mode=all">models</a>, and
1504                     <a href="http://cpansearch.perl.org/search?query=Catalyst%3A%3AView%3A%3A&amp;mode=all">views</a>;
1505                     they can save you a lot of work.</p>
1506                     <pre><code>script/${prefix}_create.pl --help</code></pre>
1507                     <p>Also, be sure to check out the vast and growing
1508                     collection of <a href="http://search.cpan.org/search?query=Catalyst">plugins for Catalyst on CPAN</a>;
1509                     you are likely to find what you need there.
1510                     </p>
1511
1512                  <h2>Need help?</h2>
1513                  <p>Catalyst has a very active community. Here are the main places to
1514                     get in touch with us.</p>
1515                  <ul>
1516                      <li>
1517                          <a href="http://dev.catalyst.perl.org">Wiki</a>
1518                      </li>
1519                      <li>
1520                          <a href="http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst">Mailing-List</a>
1521                      </li>
1522                      <li>
1523                          <a href="irc://irc.perl.org/catalyst">IRC channel #catalyst on irc.perl.org</a>
1524                      </li>
1525                  </ul>
1526                  <h2>In conclusion</h2>
1527                  <p>The Catalyst team hopes you will enjoy using Catalyst as much
1528                     as we enjoyed making it. Please contact us if you have ideas
1529                     for improvement or other feedback.</p>
1530              </div>
1531          </div>
1532     </body>
1533 </html>
1534 EOF
1535 }
1536
1537 =head1 INTERNAL METHODS
1538
1539 These methods are not meant to be used by end users.
1540
1541 =head2 $c->components
1542
1543 Returns a hash of components.
1544
1545 =cut
1546
1547 around components => sub {
1548     my $orig  = shift;
1549     my $class = shift;
1550     my $comps = shift;
1551
1552     return $class->$orig if ( !$comps );
1553
1554 # FIXME: should this ugly kludge exist?
1555     $class->setup_config unless defined $class->container;
1556
1557 # FIXME: should there be a warning here, not to use this accessor to create the components?
1558     my $components = {};
1559
1560     my $containers;
1561     $containers->{$_} = $class->container->get_sub_container($_) for qw(model view controller);
1562
1563     for my $component ( keys %$comps ) {
1564         $components->{ $component } = $comps->{$component};
1565
1566         my ($type, $name) = _get_component_type_name($component);
1567
1568 # FIXME: shouldn't the service name be $name?
1569         $containers->{$type}->add_service(Catalyst::BlockInjection->new( name => $name, block => sub { return $class->setup_component($component) } ));
1570     }
1571
1572     return $class->$orig($components);
1573 };
1574
1575 =head2 $c->context_class
1576
1577 Returns or sets the context class.
1578
1579 =head2 $c->counter
1580
1581 Returns a hashref containing coderefs and execution counts (needed for
1582 deep recursion detection).
1583
1584 =head2 $c->depth
1585
1586 Returns the number of actions on the current internal execution stack.
1587
1588 =head2 $c->dispatch
1589
1590 Dispatches a request to actions.
1591
1592 =cut
1593
1594 sub dispatch { my $c = shift; $c->dispatcher->dispatch( $c, @_ ) }
1595
1596 =head2 $c->dispatcher_class
1597
1598 Returns or sets the dispatcher class.
1599
1600 =head2 $c->dump_these
1601
1602 Returns a list of 2-element array references (name, structure) pairs
1603 that will be dumped on the error page in debug mode.
1604
1605 =cut
1606
1607 sub dump_these {
1608     my $c = shift;
1609     [ Request => $c->req ],
1610     [ Response => $c->res ],
1611     [ Stash => $c->stash ],
1612     [ Config => $c->config ];
1613 }
1614
1615 =head2 $c->engine_class
1616
1617 Returns or sets the engine class.
1618
1619 =head2 $c->execute( $class, $coderef )
1620
1621 Execute a coderef in given class and catch exceptions. Errors are available
1622 via $c->error.
1623
1624 =cut
1625
1626 sub execute {
1627     my ( $c, $class, $code ) = @_;
1628     $class = $c->component($class) || $class;
1629     $c->state(0);
1630
1631     if ( $c->depth >= $RECURSION ) {
1632         my $action = $code->reverse();
1633         $action = "/$action" unless $action =~ /->/;
1634         my $error = qq/Deep recursion detected calling "${action}"/;
1635         $c->log->error($error);
1636         $c->error($error);
1637         $c->state(0);
1638         return $c->state;
1639     }
1640
1641     my $stats_info = $c->_stats_start_execute( $code ) if $c->use_stats;
1642
1643     push( @{ $c->stack }, $code );
1644
1645     no warnings 'recursion';
1646     # N.B. This used to be combined, but I have seen $c get clobbered if so, and
1647     #      I have no idea how, ergo $ret (which appears to fix the issue)
1648     eval { my $ret = $code->execute( $class, $c, @{ $c->req->args } ) || 0; $c->state( $ret ) };
1649
1650     $c->_stats_finish_execute( $stats_info ) if $c->use_stats and $stats_info;
1651
1652     my $last = pop( @{ $c->stack } );
1653
1654     if ( my $error = $@ ) {
1655         if ( blessed($error) and $error->isa('Catalyst::Exception::Detach') ) {
1656             $error->rethrow if $c->depth > 1;
1657         }
1658         elsif ( blessed($error) and $error->isa('Catalyst::Exception::Go') ) {
1659             $error->rethrow if $c->depth > 0;
1660         }
1661         else {
1662             unless ( ref $error ) {
1663                 no warnings 'uninitialized';
1664                 chomp $error;
1665                 my $class = $last->class;
1666                 my $name  = $last->name;
1667                 $error = qq/Caught exception in $class->$name "$error"/;
1668             }
1669             $c->error($error);
1670         }
1671         $c->state(0);
1672     }
1673     return $c->state;
1674 }
1675
1676 sub _stats_start_execute {
1677     my ( $c, $code ) = @_;
1678     my $appclass = ref($c) || $c;
1679     return if ( ( $code->name =~ /^_.*/ )
1680         && ( !$appclass->config->{show_internal_actions} ) );
1681
1682     my $action_name = $code->reverse();
1683     $c->counter->{$action_name}++;
1684
1685     my $action = $action_name;
1686     $action = "/$action" unless $action =~ /->/;
1687
1688     # determine if the call was the result of a forward
1689     # this is done by walking up the call stack and looking for a calling
1690     # sub of Catalyst::forward before the eval
1691     my $callsub = q{};
1692     for my $index ( 2 .. 11 ) {
1693         last
1694         if ( ( caller($index) )[0] eq 'Catalyst'
1695             && ( caller($index) )[3] eq '(eval)' );
1696
1697         if ( ( caller($index) )[3] =~ /forward$/ ) {
1698             $callsub = ( caller($index) )[3];
1699             $action  = "-> $action";
1700             last;
1701         }
1702     }
1703
1704     my $uid = $action_name . $c->counter->{$action_name};
1705
1706     # is this a root-level call or a forwarded call?
1707     if ( $callsub =~ /forward$/ ) {
1708         my $parent = $c->stack->[-1];
1709
1710         # forward, locate the caller
1711         if ( defined $parent && exists $c->counter->{"$parent"} ) {
1712             $c->stats->profile(
1713                 begin  => $action,
1714                 parent => "$parent" . $c->counter->{"$parent"},
1715                 uid    => $uid,
1716             );
1717         }
1718         else {
1719
1720             # forward with no caller may come from a plugin
1721             $c->stats->profile(
1722                 begin => $action,
1723                 uid   => $uid,
1724             );
1725         }
1726     }
1727     else {
1728
1729         # root-level call
1730         $c->stats->profile(
1731             begin => $action,
1732             uid   => $uid,
1733         );
1734     }
1735     return $action;
1736
1737 }
1738
1739 sub _stats_finish_execute {
1740     my ( $c, $info ) = @_;
1741     $c->stats->profile( end => $info );
1742 }
1743
1744 =head2 $c->finalize
1745
1746 Finalizes the request.
1747
1748 =cut
1749
1750 sub finalize {
1751     my $c = shift;
1752
1753     for my $error ( @{ $c->error } ) {
1754         $c->log->error($error);
1755     }
1756
1757     # Allow engine to handle finalize flow (for POE)
1758     my $engine = $c->engine;
1759     if ( my $code = $engine->can('finalize') ) {
1760         $engine->$code($c);
1761     }
1762     else {
1763
1764         $c->finalize_uploads;
1765
1766         # Error
1767         if ( $#{ $c->error } >= 0 ) {
1768             $c->finalize_error;
1769         }
1770
1771         $c->finalize_headers;
1772
1773         # HEAD request
1774         if ( $c->request->method eq 'HEAD' ) {
1775             $c->response->body('');
1776         }
1777
1778         $c->finalize_body;
1779     }
1780
1781     $c->log_response;
1782
1783     if ($c->use_stats) {
1784         my $elapsed = sprintf '%f', $c->stats->elapsed;
1785         my $av = $elapsed == 0 ? '??' : sprintf '%.3f', 1 / $elapsed;
1786         $c->log->info(
1787             "Request took ${elapsed}s ($av/s)\n" . $c->stats->report . "\n" );
1788     }
1789
1790     return $c->response->status;
1791 }
1792
1793 =head2 $c->finalize_body
1794
1795 Finalizes body.
1796
1797 =cut
1798
1799 sub finalize_body { my $c = shift; $c->engine->finalize_body( $c, @_ ) }
1800
1801 =head2 $c->finalize_cookies
1802
1803 Finalizes cookies.
1804
1805 =cut
1806
1807 sub finalize_cookies { my $c = shift; $c->engine->finalize_cookies( $c, @_ ) }
1808
1809 =head2 $c->finalize_error
1810
1811 Finalizes error.
1812
1813 =cut
1814
1815 sub finalize_error { my $c = shift; $c->engine->finalize_error( $c, @_ ) }
1816
1817 =head2 $c->finalize_headers
1818
1819 Finalizes headers.
1820
1821 =cut
1822
1823 sub finalize_headers {
1824     my $c = shift;
1825
1826     my $response = $c->response; #accessor calls can add up?
1827
1828     # Check if we already finalized headers
1829     return if $response->finalized_headers;
1830
1831     # Handle redirects
1832     if ( my $location = $response->redirect ) {
1833         $c->log->debug(qq/Redirecting to "$location"/) if $c->debug;
1834         $response->header( Location => $location );
1835
1836         if ( !$response->has_body ) {
1837             # Add a default body if none is already present
1838             $response->body(
1839                 qq{<html><body><p>This item has moved <a href="$location">here</a>.</p></body></html>}
1840             );
1841         }
1842     }
1843
1844     # Content-Length
1845     if ( defined $response->body && length $response->body && !$response->content_length ) {
1846
1847         # get the length from a filehandle
1848         if ( blessed( $response->body ) && $response->body->can('read') || ref( $response->body ) eq 'GLOB' )
1849         {
1850             my $stat = stat $response->body;
1851             if ( $stat && $stat->size > 0 ) {
1852                 $response->content_length( $stat->size );
1853             }
1854             else {
1855                 $c->log->warn('Serving filehandle without a content-length');
1856             }
1857         }
1858         else {
1859             # everything should be bytes at this point, but just in case
1860             $response->content_length( length( $response->body ) );
1861         }
1862     }
1863
1864     # Errors
1865     if ( $response->status =~ /^(1\d\d|[23]04)$/ ) {
1866         $response->headers->remove_header("Content-Length");
1867         $response->body('');
1868     }
1869
1870     $c->finalize_cookies;
1871
1872     $c->engine->finalize_headers( $c, @_ );
1873
1874     # Done
1875     $response->finalized_headers(1);
1876 }
1877
1878 =head2 $c->finalize_output
1879
1880 An alias for finalize_body.
1881
1882 =head2 $c->finalize_read
1883
1884 Finalizes the input after reading is complete.
1885
1886 =cut
1887
1888 sub finalize_read { my $c = shift; $c->engine->finalize_read( $c, @_ ) }
1889
1890 =head2 $c->finalize_uploads
1891
1892 Finalizes uploads. Cleans up any temporary files.
1893
1894 =cut
1895
1896 sub finalize_uploads { my $c = shift; $c->engine->finalize_uploads( $c, @_ ) }
1897
1898 =head2 $c->get_action( $action, $namespace )
1899
1900 Gets an action in a given namespace.
1901
1902 =cut
1903
1904 sub get_action { my $c = shift; $c->dispatcher->get_action(@_) }
1905
1906 =head2 $c->get_actions( $action, $namespace )
1907
1908 Gets all actions of a given name in a namespace and all parent
1909 namespaces.
1910
1911 =cut
1912
1913 sub get_actions { my $c = shift; $c->dispatcher->get_actions( $c, @_ ) }
1914
1915 =head2 $app->handle_request( @arguments )
1916
1917 Called to handle each HTTP request.
1918
1919 =cut
1920
1921 sub handle_request {
1922     my ( $class, @arguments ) = @_;
1923
1924     # Always expect worst case!
1925     my $status = -1;
1926     eval {
1927         if ($class->debug) {
1928             my $secs = time - $START || 1;
1929             my $av = sprintf '%.3f', $COUNT / $secs;
1930             my $time = localtime time;
1931             $class->log->info("*** Request $COUNT ($av/s) [$$] [$time] ***");
1932         }
1933
1934         my $c = $class->prepare(@arguments);
1935         $c->dispatch;
1936         $status = $c->finalize;
1937     };
1938
1939     if ( my $error = $@ ) {
1940         chomp $error;
1941         $class->log->error(qq/Caught exception in engine "$error"/);
1942     }
1943
1944     $COUNT++;
1945
1946     if(my $coderef = $class->log->can('_flush')){
1947         $class->log->$coderef();
1948     }
1949     return $status;
1950 }
1951
1952 =head2 $c->prepare( @arguments )
1953
1954 Creates a Catalyst context from an engine-specific request (Apache, CGI,
1955 etc.).
1956
1957 =cut
1958
1959 sub prepare {
1960     my ( $class, @arguments ) = @_;
1961
1962     # XXX
1963     # After the app/ctxt split, this should become an attribute based on something passed
1964     # into the application.
1965     $class->context_class( ref $class || $class ) unless $class->context_class;
1966
1967     my $c = $class->context_class->new({});
1968
1969     # For on-demand data
1970     $c->request->_context($c);
1971     $c->response->_context($c);
1972
1973     #surely this is not the most efficient way to do things...
1974     $c->stats($class->stats_class->new)->enable($c->use_stats);
1975     if ( $c->debug || $c->config->{enable_catalyst_header} ) {
1976         $c->res->headers->header( 'X-Catalyst' => $Catalyst::VERSION );
1977     }
1978
1979     #XXX reuse coderef from can
1980     # Allow engine to direct the prepare flow (for POE)
1981     if ( $c->engine->can('prepare') ) {
1982         $c->engine->prepare( $c, @arguments );
1983     }
1984     else {
1985         $c->prepare_request(@arguments);
1986         $c->prepare_connection;
1987         $c->prepare_query_parameters;
1988         $c->prepare_headers;
1989         $c->prepare_cookies;
1990         $c->prepare_path;
1991
1992         # Prepare the body for reading, either by prepare_body
1993         # or the user, if they are using $c->read
1994         $c->prepare_read;
1995
1996         # Parse the body unless the user wants it on-demand
1997         unless ( ref($c)->config->{parse_on_demand} ) {
1998             $c->prepare_body;
1999         }
2000     }
2001
2002     my $method  = $c->req->method  || '';
2003     my $path    = $c->req->path;
2004     $path       = '/' unless length $path;
2005     my $address = $c->req->address || '';
2006
2007     $c->log_request;
2008
2009     $c->prepare_action;
2010
2011     return $c;
2012 }
2013
2014 =head2 $c->prepare_action
2015
2016 Prepares action. See L<Catalyst::Dispatcher>.
2017
2018 =cut
2019
2020 sub prepare_action { my $c = shift; $c->dispatcher->prepare_action( $c, @_ ) }
2021
2022 =head2 $c->prepare_body
2023
2024 Prepares message body.
2025
2026 =cut
2027
2028 sub prepare_body {
2029     my $c = shift;
2030
2031     return if $c->request->_has_body;
2032
2033     # Initialize on-demand data
2034     $c->engine->prepare_body( $c, @_ );
2035     $c->prepare_parameters;
2036     $c->prepare_uploads;
2037 }
2038
2039 =head2 $c->prepare_body_chunk( $chunk )
2040
2041 Prepares a chunk of data before sending it to L<HTTP::Body>.
2042
2043 See L<Catalyst::Engine>.
2044
2045 =cut
2046
2047 sub prepare_body_chunk {
2048     my $c = shift;
2049     $c->engine->prepare_body_chunk( $c, @_ );
2050 }
2051
2052 =head2 $c->prepare_body_parameters
2053
2054 Prepares body parameters.
2055
2056 =cut
2057
2058 sub prepare_body_parameters {
2059     my $c = shift;
2060     $c->engine->prepare_body_parameters( $c, @_ );
2061 }
2062
2063 =head2 $c->prepare_connection
2064
2065 Prepares connection.
2066
2067 =cut
2068
2069 sub prepare_connection {
2070     my $c = shift;
2071     $c->engine->prepare_connection( $c, @_ );
2072 }
2073
2074 =head2 $c->prepare_cookies
2075
2076 Prepares cookies.
2077
2078 =cut
2079
2080 sub prepare_cookies { my $c = shift; $c->engine->prepare_cookies( $c, @_ ) }
2081
2082 =head2 $c->prepare_headers
2083
2084 Prepares headers.
2085
2086 =cut
2087
2088 sub prepare_headers { my $c = shift; $c->engine->prepare_headers( $c, @_ ) }
2089
2090 =head2 $c->prepare_parameters
2091
2092 Prepares parameters.
2093
2094 =cut
2095
2096 sub prepare_parameters {
2097     my $c = shift;
2098     $c->prepare_body_parameters;
2099     $c->engine->prepare_parameters( $c, @_ );
2100 }
2101
2102 =head2 $c->prepare_path
2103
2104 Prepares path and base.
2105
2106 =cut
2107
2108 sub prepare_path { my $c = shift; $c->engine->prepare_path( $c, @_ ) }
2109
2110 =head2 $c->prepare_query_parameters
2111
2112 Prepares query parameters.
2113
2114 =cut
2115
2116 sub prepare_query_parameters {
2117     my $c = shift;
2118
2119     $c->engine->prepare_query_parameters( $c, @_ );
2120 }
2121
2122 =head2 $c->log_request
2123
2124 Writes information about the request to the debug logs.  This includes:
2125
2126 =over 4
2127
2128 =item * Request method, path, and remote IP address
2129
2130 =item * Query keywords (see L<Catalyst::Request/query_keywords>)
2131
2132 =item * Request parameters
2133
2134 =item * File uploads
2135
2136 =back
2137
2138 =cut
2139
2140 sub log_request {
2141     my $c = shift;
2142
2143     return unless $c->debug;
2144
2145     my($dump) = grep {$_->[0] eq 'Request' } $c->dump_these;
2146     my $request = $dump->[1];
2147
2148     my ( $method, $path, $address ) = ( $request->method, $request->path, $request->address );
2149     $method ||= '';
2150     $path = '/' unless length $path;
2151     $address ||= '';
2152     $c->log->debug(qq/"$method" request for "$path" from "$address"/);
2153
2154     $c->log_request_headers($request->headers);
2155
2156     if ( my $keywords = $request->query_keywords ) {
2157         $c->log->debug("Query keywords are: $keywords");
2158     }
2159
2160     $c->log_request_parameters( query => $request->query_parameters, $request->_has_body ? (body => $request->body_parameters) : () );
2161
2162     $c->log_request_uploads($request);
2163 }
2164
2165 =head2 $c->log_response
2166
2167 Writes information about the response to the debug logs by calling
2168 C<< $c->log_response_status_line >> and C<< $c->log_response_headers >>.
2169
2170 =cut
2171
2172 sub log_response {
2173     my $c = shift;
2174
2175     return unless $c->debug;
2176
2177     my($dump) = grep {$_->[0] eq 'Response' } $c->dump_these;
2178     my $response = $dump->[1];
2179
2180     $c->log_response_status_line($response);
2181     $c->log_response_headers($response->headers);
2182 }
2183
2184 =head2 $c->log_response_status_line($response)
2185
2186 Writes one line of information about the response to the debug logs.  This includes:
2187
2188 =over 4
2189
2190 =item * Response status code
2191
2192 =item * Content-Type header (if present)
2193
2194 =item * Content-Length header (if present)
2195
2196 =back
2197
2198 =cut
2199
2200 sub log_response_status_line {
2201     my ($c, $response) = @_;
2202
2203     $c->log->debug(
2204         sprintf(
2205             'Response Code: %s; Content-Type: %s; Content-Length: %s',
2206             $response->status                            || 'unknown',
2207             $response->headers->header('Content-Type')   || 'unknown',
2208             $response->headers->header('Content-Length') || 'unknown'
2209         )
2210     );
2211 }
2212
2213 =head2 $c->log_response_headers($headers);
2214
2215 Hook method which can be wrapped by plugins to log the responseheaders.
2216 No-op in the default implementation.
2217
2218 =cut
2219
2220 sub log_response_headers {}
2221
2222 =head2 $c->log_request_parameters( query => {}, body => {} )
2223
2224 Logs request parameters to debug logs
2225
2226 =cut
2227
2228 sub log_request_parameters {
2229     my $c          = shift;
2230     my %all_params = @_;
2231
2232     return unless $c->debug;
2233
2234     my $column_width = Catalyst::Utils::term_width() - 44;
2235     foreach my $type (qw(query body)) {
2236         my $params = $all_params{$type};
2237         next if ! keys %$params;
2238         my $t = Text::SimpleTable->new( [ 35, 'Parameter' ], [ $column_width, 'Value' ] );
2239         for my $key ( sort keys %$params ) {
2240             my $param = $params->{$key};
2241             my $value = defined($param) ? $param : '';
2242             $t->row( $key, ref $value eq 'ARRAY' ? ( join ', ', @$value ) : $value );
2243         }
2244         $c->log->debug( ucfirst($type) . " Parameters are:\n" . $t->draw );
2245     }
2246 }
2247
2248 =head2 $c->log_request_uploads
2249
2250 Logs file uploads included in the request to the debug logs.
2251 The parameter name, filename, file type, and file size are all included in
2252 the debug logs.
2253
2254 =cut
2255
2256 sub log_request_uploads {
2257     my $c = shift;
2258     my $request = shift;
2259     return unless $c->debug;
2260     my $uploads = $request->uploads;
2261     if ( keys %$uploads ) {
2262         my $t = Text::SimpleTable->new(
2263             [ 12, 'Parameter' ],
2264             [ 26, 'Filename' ],
2265             [ 18, 'Type' ],
2266             [ 9,  'Size' ]
2267         );
2268         for my $key ( sort keys %$uploads ) {
2269             my $upload = $uploads->{$key};
2270             for my $u ( ref $upload eq 'ARRAY' ? @{$upload} : ($upload) ) {
2271                 $t->row( $key, $u->filename, $u->type, $u->size );
2272             }
2273         }
2274         $c->log->debug( "File Uploads are:\n" . $t->draw );
2275     }
2276 }
2277
2278 =head2 $c->log_request_headers($headers);
2279
2280 Hook method which can be wrapped by plugins to log the request headers.
2281 No-op in the default implementation.
2282
2283 =cut
2284
2285 sub log_request_headers {}
2286
2287 =head2 $c->log_headers($type => $headers)
2288
2289 Logs L<HTTP::Headers> (either request or response) to the debug logs.
2290
2291 =cut
2292
2293 sub log_headers {
2294     my $c       = shift;
2295     my $type    = shift;
2296     my $headers = shift;    # an HTTP::Headers instance
2297
2298     return unless $c->debug;
2299
2300     my $column_width = Catalyst::Utils::term_width() - 28;
2301     my $t = Text::SimpleTable->new( [ 15, 'Header Name' ], [ $column_width, 'Value' ] );
2302     $headers->scan(
2303         sub {
2304             my ( $name, $value ) = @_;
2305             $t->row( $name, $value );
2306         }
2307     );
2308     $c->log->debug( ucfirst($type) . " Headers:\n" . $t->draw );
2309 }
2310
2311
2312 =head2 $c->prepare_read
2313
2314 Prepares the input for reading.
2315
2316 =cut
2317
2318 sub prepare_read { my $c = shift; $c->engine->prepare_read( $c, @_ ) }
2319
2320 =head2 $c->prepare_request
2321
2322 Prepares the engine request.
2323
2324 =cut
2325
2326 sub prepare_request { my $c = shift; $c->engine->prepare_request( $c, @_ ) }
2327
2328 =head2 $c->prepare_uploads
2329
2330 Prepares uploads.
2331
2332 =cut
2333
2334 sub prepare_uploads {
2335     my $c = shift;
2336
2337     $c->engine->prepare_uploads( $c, @_ );
2338 }
2339
2340 =head2 $c->prepare_write
2341
2342 Prepares the output for writing.
2343
2344 =cut
2345
2346 sub prepare_write { my $c = shift; $c->engine->prepare_write( $c, @_ ) }
2347
2348 =head2 $c->request_class
2349
2350 Returns or sets the request class. Defaults to L<Catalyst::Request>.
2351
2352 =head2 $c->response_class
2353
2354 Returns or sets the response class. Defaults to L<Catalyst::Response>.
2355
2356 =head2 $c->read( [$maxlength] )
2357
2358 Reads a chunk of data from the request body. This method is designed to
2359 be used in a while loop, reading C<$maxlength> bytes on every call.
2360 C<$maxlength> defaults to the size of the request if not specified.
2361
2362 You have to set C<< MyApp->config(parse_on_demand => 1) >> to use this
2363 directly.
2364
2365 Warning: If you use read(), Catalyst will not process the body,
2366 so you will not be able to access POST parameters or file uploads via
2367 $c->request.  You must handle all body parsing yourself.
2368
2369 =cut
2370
2371 sub read { my $c = shift; return $c->engine->read( $c, @_ ) }
2372
2373 =head2 $c->run
2374
2375 Starts the engine.
2376
2377 =cut
2378
2379 sub run { my $c = shift; return $c->engine->run( $c, @_ ) }
2380
2381 =head2 $c->set_action( $action, $code, $namespace, $attrs )
2382
2383 Sets an action in a given namespace.
2384
2385 =cut
2386
2387 sub set_action { my $c = shift; $c->dispatcher->set_action( $c, @_ ) }
2388
2389 =head2 $c->setup_actions($component)
2390
2391 Sets up actions for a component.
2392
2393 =cut
2394
2395 sub setup_actions { my $c = shift; $c->dispatcher->setup_actions( $c, @_ ) }
2396
2397 =head2 $c->setup_config
2398
2399 =cut
2400
2401 sub setup_config {
2402     my $class = shift;
2403
2404     my %args = %{ $class->config || {} };
2405
2406     my @container_classes = ( "${class}::Container", 'Catalyst::Container');
2407     unshift @container_classes, delete $args{container_class} if exists $args{container_class};
2408
2409     my $container_class = Class::MOP::load_first_existing_class(@container_classes);
2410
2411     my $container = $container_class->new( %args, name => "$class" );
2412     $class->container($container);
2413
2414     my $config = $container->resolve(service => 'config');
2415     $class->config($config);
2416     $class->finalize_config; # back-compat
2417 }
2418
2419 =head $c->finalize_config
2420
2421 =cut
2422
2423 sub finalize_config { }
2424
2425 =head2 $c->setup_components
2426
2427 This method is called internally to set up the application's components.
2428
2429 It finds modules by calling the L<locate_components> method, expands them to
2430 package names with the L<expand_component_module> method, and then installs
2431 each component into the application.
2432
2433 The C<setup_components> config option is passed to both of the above methods.
2434
2435 Installation of each component is performed by the L<setup_component> method,
2436 below.
2437
2438 =cut
2439
2440 sub setup_components {
2441     my $class = shift;
2442
2443     my $config  = $class->config->{ setup_components };
2444
2445     my @comps = $class->locate_components($config);
2446     my %comps = map { $_ => 1 } @comps;
2447
2448     my $deprecatedcatalyst_component_names = grep { /::[CMV]::/ } @comps;
2449     $class->log->warn(qq{Your application is using the deprecated ::[MVC]:: type naming scheme.\n}.
2450         qq{Please switch your class names to ::Model::, ::View:: and ::Controller: as appropriate.\n}
2451     ) if $deprecatedcatalyst_component_names;
2452
2453     for my $component ( @comps ) {
2454
2455         # We pass ignore_loaded here so that overlay files for (e.g.)
2456         # Model::DBI::Schema sub-classes are loaded - if it's in @comps
2457         # we know M::P::O found a file on disk so this is safe
2458
2459         Catalyst::Utils::ensure_class_loaded( $component, { ignore_loaded => 1 } );
2460     }
2461
2462     my $containers;
2463     $containers->{$_} = $class->container->get_sub_container($_) for qw(model view controller);
2464
2465     for my $component (@comps) {
2466         my $instance = $class->components->{ $component } = $class->setup_component($component);
2467         if ( my ($type, $name) = _get_component_type_name($component) ) {
2468             $containers->{$type}->add_service(Catalyst::BlockInjection->new( name => $name, block => sub { return $instance } ));
2469         }
2470         my @expanded_components = $instance->can('expand_modules')
2471             ? $instance->expand_modules( $component, $config )
2472             : $class->expand_component_module( $component, $config );
2473         for my $component (@expanded_components) {
2474             next if $comps{$component};
2475
2476             $deprecatedcatalyst_component_names = grep { /::[CMV]::/ } @expanded_components;
2477             $class->log->warn(qq{Your application is using the deprecated ::[MVC]:: type naming scheme.\n}.
2478                 qq{Please switch your class names to ::Model::, ::View:: and ::Controller: as appropriate.\n}
2479             ) if $deprecatedcatalyst_component_names;
2480
2481             if (my ($type, $name) = _get_component_type_name($component)) {
2482                 $containers->{$type}->add_service(Catalyst::BlockInjection->new( name => $name, block => sub { return $class->setup_component($component) } ));
2483             }
2484
2485             $class->components->{ $component } = $class->setup_component($component);
2486         }
2487     }
2488 }
2489
2490 sub _get_component_type_name {
2491     my $component = shift;
2492     my @parts     = split /::/, $component;
2493
2494     while (my $type = shift @parts) {
2495         return ('controller', join '::', @parts)
2496             if $type =~ /^(c|controller)$/i;
2497
2498         return ('model', join '::', @parts)
2499             if $type =~ /^(m|model)$/i;
2500
2501         return ('view', join '::', @parts)
2502             if $type =~ /^(v|view)$/i;
2503     }
2504 }
2505
2506 =head2 $c->locate_components( $setup_component_config )
2507
2508 This method is meant to provide a list of component modules that should be
2509 setup for the application.  By default, it will use L<Module::Pluggable>.
2510
2511 Specify a C<setup_components> config option to pass additional options directly
2512 to L<Module::Pluggable>. To add additional search paths, specify a key named
2513 C<search_extra> as an array reference. Items in the array beginning with C<::>
2514 will have the application class name prepended to them.
2515
2516 =cut
2517
2518 sub locate_components {
2519     my $class  = shift;
2520     my $config = shift;
2521
2522     my @paths   = qw( ::Controller ::C ::Model ::M ::View ::V );
2523     my $extra   = delete $config->{ search_extra } || [];
2524
2525     push @paths, @$extra;
2526
2527     my $locator = Module::Pluggable::Object->new(
2528         search_path => [ map { s/^(?=::)/$class/; $_; } @paths ],
2529         %$config
2530     );
2531
2532     # XXX think about ditching this sort entirely
2533     my @comps = sort { length $a <=> length $b } $locator->plugins;
2534
2535     return @comps;
2536 }
2537
2538 =head2 $c->expand_component_module( $component, $setup_component_config )
2539
2540 Components found by C<locate_components> will be passed to this method, which
2541 is expected to return a list of component (package) names to be set up.
2542
2543 =cut
2544
2545 sub expand_component_module {
2546     my ($class, $module) = @_;
2547     return Devel::InnerPackage::list_packages( $module );
2548 }
2549
2550 =head2 $c->setup_component
2551
2552 =cut
2553
2554 sub setup_component {
2555     my( $class, $component ) = @_;
2556
2557     unless ( $component->can( 'COMPONENT' ) ) {
2558         return $component;
2559     }
2560
2561     my $suffix = Catalyst::Utils::class2classsuffix( $component );
2562     my $config = $class->config->{ $suffix } || {};
2563     # Stash catalyst_component_name in the config here, so that custom COMPONENT
2564     # methods also pass it. local to avoid pointlessly shitting in config
2565     # for the debug screen, as $component is already the key name.
2566     local $config->{catalyst_component_name} = $component;
2567
2568     my $instance = eval { $component->COMPONENT( $class, $config ); };
2569
2570     if ( my $error = $@ ) {
2571         chomp $error;
2572         Catalyst::Exception->throw(
2573             message => qq/Couldn't instantiate component "$component", "$error"/
2574         );
2575     }
2576     elsif (!blessed $instance) {
2577         my $metaclass = Moose::Util::find_meta($component);
2578         my $method_meta = $metaclass->find_method_by_name('COMPONENT');
2579         my $component_method_from = $method_meta->associated_metaclass->name;
2580         my $value = defined($instance) ? $instance : 'undef';
2581         Catalyst::Exception->throw(
2582             message =>
2583             qq/Couldn't instantiate component "$component", COMPONENT() method (from $component_method_from) didn't return an object-like value (value was $value)./
2584         );
2585     }
2586
2587     return $instance;
2588 }
2589
2590 =head2 $c->setup_dispatcher
2591
2592 Sets up dispatcher.
2593
2594 =cut
2595
2596 sub setup_dispatcher {
2597     my ( $class, $dispatcher ) = @_;
2598
2599     if ($dispatcher) {
2600         $dispatcher = 'Catalyst::Dispatcher::' . $dispatcher;
2601     }
2602
2603     if ( my $env = Catalyst::Utils::env_value( $class, 'DISPATCHER' ) ) {
2604         $dispatcher = 'Catalyst::Dispatcher::' . $env;
2605     }
2606
2607     unless ($dispatcher) {
2608         $dispatcher = $class->dispatcher_class;
2609     }
2610
2611     Class::MOP::load_class($dispatcher);
2612
2613     # dispatcher instance
2614     $class->dispatcher( $dispatcher->new );
2615 }
2616
2617 =head2 $c->setup_engine
2618
2619 Sets up engine.
2620
2621 =cut
2622
2623 sub setup_engine {
2624     my ( $class, $engine ) = @_;
2625
2626     if ($engine) {
2627         $engine = 'Catalyst::Engine::' . $engine;
2628     }
2629
2630     if ( my $env = Catalyst::Utils::env_value( $class, 'ENGINE' ) ) {
2631         $engine = 'Catalyst::Engine::' . $env;
2632     }
2633
2634     if ( $ENV{MOD_PERL} ) {
2635         my $meta = Class::MOP::get_metaclass_by_name($class);
2636
2637         # create the apache method
2638         $meta->add_method('apache' => sub { shift->engine->apache });
2639
2640         my ( $software, $version ) =
2641           $ENV{MOD_PERL} =~ /^(\S+)\/(\d+(?:[\.\_]\d+)+)/;
2642
2643         $version =~ s/_//g;
2644         $version =~ s/(\.[^.]+)\./$1/g;
2645
2646         if ( $software eq 'mod_perl' ) {
2647
2648             if ( !$engine ) {
2649
2650                 if ( $version >= 1.99922 ) {
2651                     $engine = 'Catalyst::Engine::Apache2::MP20';
2652                 }
2653
2654                 elsif ( $version >= 1.9901 ) {
2655                     $engine = 'Catalyst::Engine::Apache2::MP19';
2656                 }
2657
2658                 elsif ( $version >= 1.24 ) {
2659                     $engine = 'Catalyst::Engine::Apache::MP13';
2660                 }
2661
2662                 else {
2663                     Catalyst::Exception->throw( message =>
2664                           qq/Unsupported mod_perl version: $ENV{MOD_PERL}/ );
2665                 }
2666
2667             }
2668
2669             # install the correct mod_perl handler
2670             if ( $version >= 1.9901 ) {
2671                 *handler = sub  : method {
2672                     shift->handle_request(@_);
2673                 };
2674             }
2675             else {
2676                 *handler = sub ($$) { shift->handle_request(@_) };
2677             }
2678
2679         }
2680
2681         elsif ( $software eq 'Zeus-Perl' ) {
2682             $engine = 'Catalyst::Engine::Zeus';
2683         }
2684
2685         else {
2686             Catalyst::Exception->throw(
2687                 message => qq/Unsupported mod_perl: $ENV{MOD_PERL}/ );
2688         }
2689     }
2690
2691     unless ($engine) {
2692         $engine = $class->engine_class;
2693     }
2694
2695     Class::MOP::load_class($engine);
2696
2697     # check for old engines that are no longer compatible
2698     my $old_engine;
2699     if ( $engine->isa('Catalyst::Engine::Apache')
2700         && !Catalyst::Engine::Apache->VERSION )
2701     {
2702         $old_engine = 1;
2703     }
2704
2705     elsif ( $engine->isa('Catalyst::Engine::Server::Base')
2706         && Catalyst::Engine::Server->VERSION le '0.02' )
2707     {
2708         $old_engine = 1;
2709     }
2710
2711     elsif ($engine->isa('Catalyst::Engine::HTTP::POE')
2712         && $engine->VERSION eq '0.01' )
2713     {
2714         $old_engine = 1;
2715     }
2716
2717     elsif ($engine->isa('Catalyst::Engine::Zeus')
2718         && $engine->VERSION eq '0.01' )
2719     {
2720         $old_engine = 1;
2721     }
2722
2723     if ($old_engine) {
2724         Catalyst::Exception->throw( message =>
2725               qq/Engine "$engine" is not supported by this version of Catalyst/
2726         );
2727     }
2728
2729     # engine instance
2730     $class->engine( $engine->new );
2731 }
2732
2733 =head2 $c->setup_home
2734
2735 Sets up the home directory.
2736
2737 =cut
2738
2739 sub setup_home {
2740     my ( $class, $home ) = @_;
2741
2742     if ( my $env = Catalyst::Utils::env_value( $class, 'HOME' ) ) {
2743         $home = $env;
2744     }
2745
2746     $home ||= Catalyst::Utils::home($class);
2747
2748     if ($home) {
2749         #I remember recently being scolded for assigning config values like this
2750         $class->config->{home} ||= $home;
2751         $class->config->{root} ||= Path::Class::Dir->new($home)->subdir('root');
2752     }
2753 }
2754
2755 =head2 $c->setup_log
2756
2757 Sets up log by instantiating a L<Catalyst::Log|Catalyst::Log> object and
2758 passing it to C<log()>. Pass in a comma-delimited list of levels to set the
2759 log to.
2760
2761 This method also installs a C<debug> method that returns a true value into the
2762 catalyst subclass if the "debug" level is passed in the comma-delimited list,
2763 or if the C<$CATALYST_DEBUG> environment variable is set to a true value.
2764
2765 Note that if the log has already been setup, by either a previous call to
2766 C<setup_log> or by a call such as C<< __PACKAGE__->log( MyLogger->new ) >>,
2767 that this method won't actually set up the log object.
2768
2769 =cut
2770
2771 sub setup_log {
2772     my ( $class, $levels ) = @_;
2773
2774     $levels ||= '';
2775     $levels =~ s/^\s+//;
2776     $levels =~ s/\s+$//;
2777     my %levels = map { $_ => 1 } split /\s*,\s*/, $levels;
2778
2779     my $env_debug = Catalyst::Utils::env_value( $class, 'DEBUG' );
2780     if ( defined $env_debug ) {
2781         $levels{debug} = 1 if $env_debug; # Ugly!
2782         delete($levels{debug}) unless $env_debug;
2783     }
2784
2785     unless ( $class->log ) {
2786         $class->log( Catalyst::Log->new(keys %levels) );
2787     }
2788
2789     if ( $levels{debug} ) {
2790         Class::MOP::get_metaclass_by_name($class)->add_method('debug' => sub { 1 });
2791         $class->log->debug('Debug messages enabled');
2792     }
2793 }
2794
2795 =head2 $c->setup_plugins
2796
2797 Sets up plugins.
2798
2799 =cut
2800
2801 =head2 $c->setup_stats
2802
2803 Sets up timing statistics class.
2804
2805 =cut
2806
2807 sub setup_stats {
2808     my ( $class, $stats ) = @_;
2809
2810     Catalyst::Utils::ensure_class_loaded($class->stats_class);
2811
2812     my $env = Catalyst::Utils::env_value( $class, 'STATS' );
2813     if ( defined($env) ? $env : ($stats || $class->debug ) ) {
2814         Class::MOP::get_metaclass_by_name($class)->add_method('use_stats' => sub { 1 });
2815         $class->log->debug('Statistics enabled');
2816     }
2817 }
2818
2819
2820 =head2 $c->registered_plugins
2821
2822 Returns a sorted list of the plugins which have either been stated in the
2823 import list or which have been added via C<< MyApp->plugin(@args); >>.
2824
2825 If passed a given plugin name, it will report a boolean value indicating
2826 whether or not that plugin is loaded.  A fully qualified name is required if
2827 the plugin name does not begin with C<Catalyst::Plugin::>.
2828
2829  if ($c->registered_plugins('Some::Plugin')) {
2830      ...
2831  }
2832
2833 =cut
2834
2835 {
2836
2837     sub registered_plugins {
2838         my $proto = shift;
2839         return sort keys %{ $proto->_plugins } unless @_;
2840         my $plugin = shift;
2841         return 1 if exists $proto->_plugins->{$plugin};
2842         return exists $proto->_plugins->{"Catalyst::Plugin::$plugin"};
2843     }
2844
2845     sub _register_plugin {
2846         my ( $proto, $plugin, $instant ) = @_;
2847         my $class = ref $proto || $proto;
2848
2849         Class::MOP::load_class( $plugin );
2850         $class->log->warn( "$plugin inherits from 'Catalyst::Component' - this is deprecated and will not work in 5.81" )
2851             if $plugin->isa( 'Catalyst::Component' );
2852         $proto->_plugins->{$plugin} = 1;
2853         unless ($instant) {
2854             my $meta = Class::MOP::get_metaclass_by_name($class);
2855             $meta->superclasses($plugin, $meta->superclasses);
2856         }
2857         return $class;
2858     }
2859
2860     sub setup_plugins {
2861         my ( $class, $plugins ) = @_;
2862
2863         $class->_plugins( {} ) unless $class->_plugins;
2864         $plugins = Data::OptList::mkopt($plugins || []);
2865
2866         my @plugins = map {
2867             [ Catalyst::Utils::resolve_namespace(
2868                   $class . '::Plugin',
2869                   'Catalyst::Plugin', $_->[0]
2870               ),
2871               $_->[1],
2872             ]
2873          } @{ $plugins };
2874
2875         for my $plugin ( reverse @plugins ) {
2876             Class::MOP::load_class($plugin->[0], $plugin->[1]);
2877             my $meta = find_meta($plugin->[0]);
2878             next if $meta && $meta->isa('Moose::Meta::Role');
2879
2880             $class->_register_plugin($plugin->[0]);
2881         }
2882
2883         my @roles =
2884             map  { $_->[0]->name, $_->[1] }
2885             grep { blessed($_->[0]) && $_->[0]->isa('Moose::Meta::Role') }
2886             map  { [find_meta($_->[0]), $_->[1]] }
2887             @plugins;
2888
2889         Moose::Util::apply_all_roles(
2890             $class => @roles
2891         ) if @roles;
2892     }
2893 }
2894
2895 =head2 $c->stack
2896
2897 Returns an arrayref of the internal execution stack (actions that are
2898 currently executing).
2899
2900 =head2 $c->stats
2901
2902 Returns the current timing statistics object. By default Catalyst uses
2903 L<Catalyst::Stats|Catalyst::Stats>, but can be set otherwise with
2904 L<< stats_class|/"$c->stats_class" >>.
2905
2906 Even if L<< -Stats|/"-Stats" >> is not enabled, the stats object is still
2907 available. By enabling it with C< $c->stats->enabled(1) >, it can be used to
2908 profile explicitly, although MyApp.pm still won't profile nor output anything
2909 by itself.
2910
2911 =head2 $c->stats_class
2912
2913 Returns or sets the stats (timing statistics) class. L<Catalyst::Stats|Catalyst::Stats> is used by default.
2914
2915 =head2 $c->use_stats
2916
2917 Returns 1 when L<< stats collection|/"-Stats" >> is enabled.
2918
2919 Note that this is a static method, not an accessor and should be overridden
2920 by declaring C<sub use_stats { 1 }> in your MyApp.pm, not by calling C<< $c->use_stats(1) >>.
2921
2922 =cut
2923
2924 sub use_stats { 0 }
2925
2926
2927 =head2 $c->write( $data )
2928
2929 Writes $data to the output stream. When using this method directly, you
2930 will need to manually set the C<Content-Length> header to the length of
2931 your output data, if known.
2932
2933 =cut
2934
2935 sub write {
2936     my $c = shift;
2937
2938     # Finalize headers if someone manually writes output
2939     $c->finalize_headers;
2940
2941     return $c->engine->write( $c, @_ );
2942 }
2943
2944 =head2 version
2945
2946 Returns the Catalyst version number. Mostly useful for "powered by"
2947 messages in template systems.
2948
2949 =cut
2950
2951 sub version { return $Catalyst::VERSION }
2952
2953 =head1 CONFIGURATION
2954
2955 There are a number of 'base' config variables which can be set:
2956
2957 =over
2958
2959 =item *
2960
2961 C<default_model> - The default model picked if you say C<< $c->model >>. See L<< /$c->model($name) >>.
2962
2963 =item *
2964
2965 C<default_view> - The default view to be rendered or returned when C<< $c->view >> is called. See L<< /$c->view($name) >>.
2966
2967 =item *
2968
2969 C<disable_component_resolution_regex_fallback> - Turns
2970 off the deprecated component resolution functionality so
2971 that if any of the component methods (e.g. C<< $c->controller('Foo') >>)
2972 are called then regex search will not be attempted on string values and
2973 instead C<undef> will be returned.
2974
2975 =item *
2976
2977 C<home> - The application home directory. In an uninstalled application,
2978 this is the top level application directory. In an installed application,
2979 this will be the directory containing C<< MyApp.pm >>.
2980
2981 =item *
2982
2983 C<ignore_frontend_proxy> - See L</PROXY SUPPORT>
2984
2985 =item *
2986
2987 C<name> - The name of the application in debug messages and the debug and
2988 welcome screens
2989
2990 =item *
2991
2992 C<parse_on_demand> - The request body (for example file uploads) will not be parsed
2993 until it is accessed. This allows you to (for example) check authentication (and reject
2994 the upload) before actually recieving all the data. See L</ON-DEMAND PARSER>
2995
2996 =item *
2997
2998 C<root> - The root directory for templates. Usually this is just a
2999 subdirectory of the home directory, but you can set it to change the
3000 templates to a different directory.
3001
3002 =item *
3003
3004 C<search_extra> - Array reference passed to Module::Pluggable to for additional
3005 namespaces from which components will be loaded (and constructed and stored in
3006 C<< $c->components >>).
3007
3008 =item *
3009
3010 C<show_internal_actions> - If true, causes internal actions such as C<< _DISPATCH >>
3011 to be shown in hit debug tables in the test server.
3012
3013 =item *
3014
3015 C<use_request_uri_for_path> - Controlls if the C<REQUEST_URI> or C<PATH_INFO> environment
3016 variable should be used for determining the request path. See L<Catalyst::Engine::CGI/PATH DECODING>
3017 for more information.
3018
3019 =item *
3020
3021 C<using_frontend_proxy> - See L</PROXY SUPPORT>.
3022
3023 =back
3024
3025 =head1 INTERNAL ACTIONS
3026
3027 Catalyst uses internal actions like C<_DISPATCH>, C<_BEGIN>, C<_AUTO>,
3028 C<_ACTION>, and C<_END>. These are by default not shown in the private
3029 action table, but you can make them visible with a config parameter.
3030
3031     MyApp->config(show_internal_actions => 1);
3032
3033 =head1 ON-DEMAND PARSER
3034
3035 The request body is usually parsed at the beginning of a request,
3036 but if you want to handle input yourself, you can enable on-demand
3037 parsing with a config parameter.
3038
3039     MyApp->config(parse_on_demand => 1);
3040
3041 =head1 PROXY SUPPORT
3042
3043 Many production servers operate using the common double-server approach,
3044 with a lightweight frontend web server passing requests to a larger
3045 backend server. An application running on the backend server must deal
3046 with two problems: the remote user always appears to be C<127.0.0.1> and
3047 the server's hostname will appear to be C<localhost> regardless of the
3048 virtual host that the user connected through.
3049
3050 Catalyst will automatically detect this situation when you are running
3051 the frontend and backend servers on the same machine. The following
3052 changes are made to the request.
3053
3054     $c->req->address is set to the user's real IP address, as read from
3055     the HTTP X-Forwarded-For header.
3056
3057     The host value for $c->req->base and $c->req->uri is set to the real
3058     host, as read from the HTTP X-Forwarded-Host header.
3059
3060 Additionally, you may be running your backend application on an insecure
3061 connection (port 80) while your frontend proxy is running under SSL.  If there
3062 is a discrepancy in the ports, use the HTTP header C<X-Forwarded-Port> to
3063 tell Catalyst what port the frontend listens on.  This will allow all URIs to
3064 be created properly.
3065
3066 In the case of passing in:
3067
3068     X-Forwarded-Port: 443
3069
3070 All calls to C<uri_for> will result in an https link, as is expected.
3071
3072 Obviously, your web server must support these headers for this to work.
3073
3074 In a more complex server farm environment where you may have your
3075 frontend proxy server(s) on different machines, you will need to set a
3076 configuration option to tell Catalyst to read the proxied data from the
3077 headers.
3078
3079     MyApp->config(using_frontend_proxy => 1);
3080
3081 If you do not wish to use the proxy support at all, you may set:
3082
3083     MyApp->config(ignore_frontend_proxy => 1);
3084
3085 =head1 THREAD SAFETY
3086
3087 Catalyst has been tested under Apache 2's threading C<mpm_worker>,
3088 C<mpm_winnt>, and the standalone forking HTTP server on Windows. We
3089 believe the Catalyst core to be thread-safe.
3090
3091 If you plan to operate in a threaded environment, remember that all other
3092 modules you are using must also be thread-safe. Some modules, most notably
3093 L<DBD::SQLite>, are not thread-safe.
3094
3095 =head1 SUPPORT
3096
3097 IRC:
3098
3099     Join #catalyst on irc.perl.org.
3100
3101 Mailing Lists:
3102
3103     http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
3104     http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst-dev
3105
3106 Web:
3107
3108     http://catalyst.perl.org
3109
3110 Wiki:
3111
3112     http://dev.catalyst.perl.org
3113
3114 =head1 SEE ALSO
3115
3116 =head2 L<Task::Catalyst> - All you need to start with Catalyst
3117
3118 =head2 L<Catalyst::Manual> - The Catalyst Manual
3119
3120 =head2 L<Catalyst::Component>, L<Catalyst::Controller> - Base classes for components
3121
3122 =head2 L<Catalyst::Engine> - Core engine
3123
3124 =head2 L<Catalyst::Log> - Log class.
3125
3126 =head2 L<Catalyst::Request> - Request object
3127
3128 =head2 L<Catalyst::Response> - Response object
3129
3130 =head2 L<Catalyst::Test> - The test suite.
3131
3132 =head1 PROJECT FOUNDER
3133
3134 sri: Sebastian Riedel <sri@cpan.org>
3135
3136 =head1 CONTRIBUTORS
3137
3138 abw: Andy Wardley
3139
3140 acme: Leon Brocard <leon@astray.com>
3141
3142 abraxxa: Alexander Hartmaier <abraxxa@cpan.org>
3143
3144 Andrew Bramble
3145
3146 Andrew Ford E<lt>A.Ford@ford-mason.co.ukE<gt>
3147
3148 Andrew Ruthven
3149
3150 andyg: Andy Grundman <andy@hybridized.org>
3151
3152 audreyt: Audrey Tang
3153
3154 bricas: Brian Cassidy <bricas@cpan.org>
3155
3156 Caelum: Rafael Kitover <rkitover@io.com>
3157
3158 chansen: Christian Hansen
3159
3160 chicks: Christopher Hicks
3161
3162 Chisel Wright C<pause@herlpacker.co.uk>
3163
3164 Danijel Milicevic C<me@danijel.de>
3165
3166 David Kamholz E<lt>dkamholz@cpan.orgE<gt>
3167
3168 David Naughton, C<naughton@umn.edu>
3169
3170 David E. Wheeler
3171
3172 dhoss: Devin Austin <dhoss@cpan.org>
3173
3174 dkubb: Dan Kubb <dan.kubb-cpan@onautopilot.com>
3175
3176 Drew Taylor
3177
3178 dwc: Daniel Westermann-Clark <danieltwc@cpan.org>
3179
3180 esskar: Sascha Kiefer
3181
3182 fireartist: Carl Franks <cfranks@cpan.org>
3183
3184 frew: Arthur Axel "fREW" Schmidt <frioux@gmail.com>
3185
3186 gabb: Danijel Milicevic
3187
3188 Gary Ashton Jones
3189
3190 Gavin Henry C<ghenry@perl.me.uk>
3191
3192 Geoff Richards
3193
3194 groditi: Guillermo Roditi <groditi@gmail.com>
3195
3196 hobbs: Andrew Rodland <andrew@cleverdomain.org>
3197
3198 ilmari: Dagfinn Ilmari MannsÃ¥ker <ilmari@ilmari.org>
3199
3200 jcamacho: Juan Camacho
3201
3202 jester: Jesse Sheidlower C<jester@panix.com>
3203
3204 jhannah: Jay Hannah <jay@jays.net>
3205
3206 Jody Belka
3207
3208 Johan Lindstrom
3209
3210 jon: Jon Schutz <jjschutz@cpan.org>
3211
3212 Jonathan Rockway C<< <jrockway@cpan.org> >>
3213
3214 Kieren Diment C<kd@totaldatasolution.com>
3215
3216 konobi: Scott McWhirter <konobi@cpan.org>
3217
3218 marcus: Marcus Ramberg <mramberg@cpan.org>
3219
3220 miyagawa: Tatsuhiko Miyagawa <miyagawa@bulknews.net>
3221
3222 mst: Matt S. Trout <mst@shadowcatsystems.co.uk>
3223
3224 mugwump: Sam Vilain
3225
3226 naughton: David Naughton
3227
3228 ningu: David Kamholz <dkamholz@cpan.org>
3229
3230 nothingmuch: Yuval Kogman <nothingmuch@woobling.org>
3231
3232 numa: Dan Sully <daniel@cpan.org>
3233
3234 obra: Jesse Vincent
3235
3236 Octavian Rasnita
3237
3238 omega: Andreas Marienborg
3239
3240 Oleg Kostyuk <cub.uanic@gmail.com>
3241
3242 phaylon: Robert Sedlacek <phaylon@dunkelheit.at>
3243
3244 rafl: Florian Ragwitz <rafl@debian.org>
3245
3246 random: Roland Lammel <lammel@cpan.org>
3247
3248 Robert Sedlacek C<< <rs@474.at> >>
3249
3250 SpiceMan: Marcel Montes
3251
3252 sky: Arthur Bergman
3253
3254 szbalint: Balint Szilakszi <szbalint@cpan.org>
3255
3256 t0m: Tomas Doran <bobtfish@bobtfish.net>
3257
3258 Ulf Edvinsson
3259
3260 Viljo Marrandi C<vilts@yahoo.com>
3261
3262 Will Hawes C<info@whawes.co.uk>
3263
3264 willert: Sebastian Willert <willert@cpan.org>
3265
3266 wreis: Wallace Reis <wallace@reis.org.br>
3267
3268 Yuval Kogman, C<nothingmuch@woobling.org>
3269
3270 rainboxx: Matthias Dietrich, C<perl@rainboxx.de>
3271
3272 dd070: Dhaval Dhanani <dhaval070@gmail.com>
3273
3274 =head1 COPYRIGHT
3275
3276 Copyright (c) 2005, the above named PROJECT FOUNDER and CONTRIBUTORS.
3277
3278 =head1 LICENSE
3279
3280 This library is free software. You can redistribute it and/or modify it under
3281 the same terms as Perl itself.
3282
3283 =cut
3284
3285 no Moose;
3286
3287 __PACKAGE__->meta->make_immutable;
3288
3289 1;