016ef2dd2f53228c249100a64c98af6486820dc3
[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 namespace::clean -except => 'meta';
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 Module::Pluggable::Object ();
20 use Text::SimpleTable ();
21 use Path::Class::Dir ();
22 use Path::Class::File ();
23 use URI ();
24 use URI::http;
25 use URI::https;
26 use HTML::Entities;
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 String::RewritePrefix;
33 use Catalyst::EngineLoader;
34 use utf8;
35 use Carp qw/croak carp shortmess/;
36 use Try::Tiny;
37 use Safe::Isa;
38 use Moose::Util 'find_meta';
39 use Plack::Middleware::Conditional;
40 use Plack::Middleware::ReverseProxy;
41 use Plack::Middleware::IIS6ScriptNameFix;
42 use Plack::Middleware::IIS7KeepAliveFix;
43 use Plack::Middleware::LighttpdScriptNameFix;
44 use Plack::Middleware::ContentLength;
45 use Plack::Middleware::Head;
46 use Plack::Middleware::HTTPExceptions;
47 use Plack::Middleware::FixMissingBodyInRedirect;
48 use Plack::Middleware::MethodOverride;
49 use Plack::Middleware::RemoveRedundantBody;
50 use Catalyst::Middleware::Stash;
51 use Plack::Util;
52 use Class::Load 'load_class';
53 use Encode 2.21 'decode_utf8', 'encode_utf8';
54
55 BEGIN { require 5.008003; }
56
57 has stack => (is => 'ro', default => sub { [] });
58 has state => (is => 'rw', default => 0);
59 has stats => (is => 'rw');
60 has action => (is => 'rw');
61 has counter => (is => 'rw', default => sub { {} });
62 has request => (
63     is => 'rw',
64     default => sub {
65         my $self = shift;
66         my $class = ref $self;
67         my $composed_request_class = $class->composed_request_class;
68         return $composed_request_class->new( $self->_build_request_constructor_args);
69     },
70     lazy => 1,
71 );
72 sub _build_request_constructor_args {
73     my $self = shift;
74     my %p = ( _log => $self->log );
75     $p{_uploadtmp} = $self->_uploadtmp if $self->_has_uploadtmp;
76     $p{data_handlers} = {$self->registered_data_handlers};
77     $p{_use_hash_multivalue} = $self->config->{use_hash_multivalue_in_request}
78       if $self->config->{use_hash_multivalue_in_request};
79     \%p;
80 }
81
82 sub composed_request_class {
83   my $class = shift;
84   my @traits = (@{$class->request_class_traits||[]}, @{$class->config->{request_class_traits}||[]});
85   return $class->_composed_request_class ||
86     $class->_composed_request_class(Moose::Util::with_traits($class->request_class, @traits));
87 }
88
89 has response => (
90     is => 'rw',
91     default => sub {
92         my $self = shift;
93         my $class = ref $self;
94         my $composed_response_class = $class->composed_response_class;
95         return $composed_response_class->new( $self->_build_response_constructor_args);
96     },
97     lazy => 1,
98 );
99 sub _build_response_constructor_args {
100     return +{
101       _log => $_[0]->log,
102       encoding => $_[0]->encoding,
103     };
104 }
105
106 sub composed_response_class {
107   my $class = shift;
108   my @traits = (@{$class->response_class_traits||[]}, @{$class->config->{response_class_traits}||[]});
109   return $class->_composed_response_class ||
110     $class->_composed_response_class(Moose::Util::with_traits($class->response_class, @traits));
111 }
112
113 has namespace => (is => 'rw');
114
115 sub depth { scalar @{ shift->stack || [] }; }
116 sub comp { shift->component(@_) }
117
118 sub req {
119     my $self = shift; return $self->request(@_);
120 }
121 sub res {
122     my $self = shift; return $self->response(@_);
123 }
124
125 # For backwards compatibility
126 sub finalize_output { shift->finalize_body(@_) };
127
128 # For statistics
129 our $COUNT     = 1;
130 our $START     = time;
131 our $RECURSION = 1000;
132 our $DETACH    = Catalyst::Exception::Detach->new;
133 our $GO        = Catalyst::Exception::Go->new;
134
135 #I imagine that very few of these really need to be class variables. if any.
136 #maybe we should just make them attributes with a default?
137 __PACKAGE__->mk_classdata($_)
138   for qw/components arguments dispatcher engine log dispatcher_class
139   engine_loader context_class request_class response_class stats_class
140   setup_finished _psgi_app loading_psgi_file run_options _psgi_middleware
141   _data_handlers _encoding _encode_check finalized_default_middleware
142   request_class_traits response_class_traits stats_class_traits
143   _composed_request_class _composed_response_class _composed_stats_class/;
144
145 __PACKAGE__->dispatcher_class('Catalyst::Dispatcher');
146 __PACKAGE__->request_class('Catalyst::Request');
147 __PACKAGE__->response_class('Catalyst::Response');
148 __PACKAGE__->stats_class('Catalyst::Stats');
149
150 sub composed_stats_class {
151   my $class = shift;
152   my @traits = (@{$class->stats_class_traits||[]}, @{$class->config->{stats_class_traits}||[]});
153   return $class->_composed_stats_class ||
154     $class->_composed_stats_class(Moose::Util::with_traits($class->stats_class, @traits));
155 }
156
157 __PACKAGE__->_encode_check(Encode::FB_CROAK | Encode::LEAVE_SRC);
158
159 # Remember to update this in Catalyst::Runtime as well!
160 our $VERSION = '5.90091';
161 $VERSION = eval $VERSION if $VERSION =~ /_/; # numify for warning-free dev releases
162
163 sub import {
164     my ( $class, @arguments ) = @_;
165
166     # We have to limit $class to Catalyst to avoid pushing Catalyst upon every
167     # callers @ISA.
168     return unless $class eq 'Catalyst';
169
170     my $caller = caller();
171     return if $caller eq 'main';
172
173     my $meta = Moose::Meta::Class->initialize($caller);
174     unless ( $caller->isa('Catalyst') ) {
175         my @superclasses = ($meta->superclasses, $class, 'Catalyst::Controller');
176         $meta->superclasses(@superclasses);
177     }
178     # Avoid possible C3 issues if 'Moose::Object' is already on RHS of MyApp
179     $meta->superclasses(grep { $_ ne 'Moose::Object' } $meta->superclasses);
180
181     unless( $meta->has_method('meta') ){
182         if ($Moose::VERSION >= 1.15) {
183             $meta->_add_meta_method('meta');
184         }
185         else {
186             $meta->add_method(meta => sub { Moose::Meta::Class->initialize("${caller}") } );
187         }
188     }
189
190     $caller->arguments( [@arguments] );
191     $caller->setup_home;
192 }
193
194 sub _application { $_[0] }
195
196 =encoding UTF-8
197
198 =head1 NAME
199
200 Catalyst - The Elegant MVC Web Application Framework
201
202 =for html
203 <a href="https://badge.fury.io/pl/Catalyst-Runtime"><img src="https://badge.fury.io/pl/Catalyst-Runtime.svg" alt="CPAN version" height="18"></a>
204 <a href="https://travis-ci.org/perl-catalyst/catalyst-runtime/"><img src="https://api.travis-ci.org/perl-catalyst/catalyst-runtime.png" alt="Catalyst></a>
205 <a href="http://cpants.cpanauthors.org/dist/Catalyst-Runtime"><img src="http://cpants.cpanauthors.org/dist/Catalyst-Runtime.png" alt='Kwalitee Score' /></a>
206
207 =head1 SYNOPSIS
208
209 See the L<Catalyst::Manual> distribution for comprehensive
210 documentation and tutorials.
211
212     # Install Catalyst::Devel for helpers and other development tools
213     # use the helper to create a new application
214     catalyst.pl MyApp
215
216     # add models, views, controllers
217     script/myapp_create.pl model MyDatabase DBIC::Schema create=static dbi:SQLite:/path/to/db
218     script/myapp_create.pl view MyTemplate TT
219     script/myapp_create.pl controller Search
220
221     # built in testserver -- use -r to restart automatically on changes
222     # --help to see all available options
223     script/myapp_server.pl
224
225     # command line testing interface
226     script/myapp_test.pl /yada
227
228     ### in lib/MyApp.pm
229     use Catalyst qw/-Debug/; # include plugins here as well
230
231     ### In lib/MyApp/Controller/Root.pm (autocreated)
232     sub foo : Chained('/') Args() { # called for /foo, /foo/1, /foo/1/2, etc.
233         my ( $self, $c, @args ) = @_; # args are qw/1 2/ for /foo/1/2
234         $c->stash->{template} = 'foo.tt'; # set the template
235         # lookup something from db -- stash vars are passed to TT
236         $c->stash->{data} =
237           $c->model('Database::Foo')->search( { country => $args[0] } );
238         if ( $c->req->params->{bar} ) { # access GET or POST parameters
239             $c->forward( 'bar' ); # process another action
240             # do something else after forward returns
241         }
242     }
243
244     # The foo.tt TT template can use the stash data from the database
245     [% WHILE (item = data.next) %]
246         [% item.foo %]
247     [% END %]
248
249     # called for /bar/of/soap, /bar/of/soap/10, etc.
250     sub bar : Chained('/') PathPart('/bar/of/soap') Args() { ... }
251
252     # called after all actions are finished
253     sub end : Action {
254         my ( $self, $c ) = @_;
255         if ( scalar @{ $c->error } ) { ... } # handle errors
256         return if $c->res->body; # already have a response
257         $c->forward( 'MyApp::View::TT' ); # render template
258     }
259
260 See L<Catalyst::Manual::Intro> for additional information.
261
262 =head1 DESCRIPTION
263
264 Catalyst is a modern framework for making web applications without the
265 pain usually associated with this process. This document is a reference
266 to the main Catalyst application. If you are a new user, we suggest you
267 start with L<Catalyst::Manual::Tutorial> or L<Catalyst::Manual::Intro>.
268
269 See L<Catalyst::Manual> for more documentation.
270
271 Catalyst plugins can be loaded by naming them as arguments to the "use
272 Catalyst" statement. Omit the C<Catalyst::Plugin::> prefix from the
273 plugin name, i.e., C<Catalyst::Plugin::My::Module> becomes
274 C<My::Module>.
275
276     use Catalyst qw/My::Module/;
277
278 If your plugin starts with a name other than C<Catalyst::Plugin::>, you can
279 fully qualify the name by using a unary plus:
280
281     use Catalyst qw/
282         My::Module
283         +Fully::Qualified::Plugin::Name
284     /;
285
286 Special flags like C<-Debug> can also be specified as
287 arguments when Catalyst is loaded:
288
289     use Catalyst qw/-Debug My::Module/;
290
291 The position of plugins and flags in the chain is important, because
292 they are loaded in the order in which they appear.
293
294 The following flags are supported:
295
296 =head2 -Debug
297
298 Enables debug output. You can also force this setting from the system
299 environment with CATALYST_DEBUG or <MYAPP>_DEBUG. The environment
300 settings override the application, with <MYAPP>_DEBUG having the highest
301 priority.
302
303 This sets the log level to 'debug' and enables full debug output on the
304 error screen. If you only want the latter, see L<< $c->debug >>.
305
306 =head2 -Home
307
308 Forces Catalyst to use a specific home directory, e.g.:
309
310     use Catalyst qw[-Home=/usr/mst];
311
312 This can also be done in the shell environment by setting either the
313 C<CATALYST_HOME> environment variable or C<MYAPP_HOME>; where C<MYAPP>
314 is replaced with the uppercased name of your application, any "::" in
315 the name will be replaced with underscores, e.g. MyApp::Web should use
316 MYAPP_WEB_HOME. If both variables are set, the MYAPP_HOME one will be used.
317
318 If none of these are set, Catalyst will attempt to automatically detect the
319 home directory. If you are working in a development environment, Catalyst
320 will try and find the directory containing either Makefile.PL, Build.PL,
321 dist.ini, or cpanfile. If the application has been installed into the system
322 (i.e. you have done C<make install>), then Catalyst will use the path to your
323 application module, without the .pm extension (e.g., /foo/MyApp if your
324 application was installed at /foo/MyApp.pm)
325
326 =head2 -Log
327
328     use Catalyst '-Log=warn,fatal,error';
329
330 Specifies a comma-delimited list of log levels.
331
332 =head2 -Stats
333
334 Enables statistics collection and reporting.
335
336    use Catalyst qw/-Stats=1/;
337
338 You can also force this setting from the system environment with CATALYST_STATS
339 or <MYAPP>_STATS. The environment settings override the application, with
340 <MYAPP>_STATS having the highest priority.
341
342 Stats are also enabled if L<< debugging |/"-Debug" >> is enabled.
343
344 =head1 METHODS
345
346 =head2 INFORMATION ABOUT THE CURRENT REQUEST
347
348 =head2 $c->action
349
350 Returns a L<Catalyst::Action> object for the current action, which
351 stringifies to the action name. See L<Catalyst::Action>.
352
353 =head2 $c->namespace
354
355 Returns the namespace of the current action, i.e., the URI prefix
356 corresponding to the controller of the current action. For example:
357
358     # in Controller::Foo::Bar
359     $c->namespace; # returns 'foo/bar';
360
361 =head2 $c->request
362
363 =head2 $c->req
364
365 Returns the current L<Catalyst::Request> object, giving access to
366 information about the current client request (including parameters,
367 cookies, HTTP headers, etc.). See L<Catalyst::Request>.
368
369 =head2 REQUEST FLOW HANDLING
370
371 =head2 $c->forward( $action [, \@arguments ] )
372
373 =head2 $c->forward( $class, $method, [, \@arguments ] )
374
375 This is one way of calling another action (method) in the same or
376 a different controller. You can also use C<< $self->my_method($c, @args) >>
377 in the same controller or C<< $c->controller('MyController')->my_method($c, @args) >>
378 in a different controller.
379 The main difference is that 'forward' uses some of the Catalyst request
380 cycle overhead, including debugging, which may be useful to you. On the
381 other hand, there are some complications to using 'forward', restrictions
382 on values returned from 'forward', and it may not handle errors as you prefer.
383 Whether you use 'forward' or not is up to you; it is not considered superior to
384 the other ways to call a method.
385
386 'forward' calls  another action, by its private name. If you give a
387 class name but no method, C<process()> is called. You may also optionally
388 pass arguments in an arrayref. The action will receive the arguments in
389 C<@_> and C<< $c->req->args >>. Upon returning from the function,
390 C<< $c->req->args >> will be restored to the previous values.
391
392 Any data C<return>ed from the action forwarded to, will be returned by the
393 call to forward.
394
395     my $foodata = $c->forward('/foo');
396     $c->forward('index');
397     $c->forward(qw/Model::DBIC::Foo do_stuff/);
398     $c->forward('View::TT');
399
400 Note that L<< forward|/"$c->forward( $action [, \@arguments ] )" >> implies
401 an C<< eval { } >> around the call (actually
402 L<< execute|/"$c->execute( $class, $coderef )" >> does), thus rendering all
403 exceptions thrown by the called action non-fatal and pushing them onto
404 $c->error instead. If you want C<die> to propagate you need to do something
405 like:
406
407     $c->forward('foo');
408     die join "\n", @{ $c->error } if @{ $c->error };
409
410 Or make sure to always return true values from your actions and write
411 your code like this:
412
413     $c->forward('foo') || return;
414
415 Another note is that C<< $c->forward >> always returns a scalar because it
416 actually returns $c->state which operates in a scalar context.
417 Thus, something like:
418
419     return @array;
420
421 in an action that is forwarded to is going to return a scalar,
422 i.e. how many items are in that array, which is probably not what you want.
423 If you need to return an array then return a reference to it,
424 or stash it like so:
425
426     $c->stash->{array} = \@array;
427
428 and access it from the stash.
429
430 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.
431
432 =cut
433
434 sub forward { my $c = shift; no warnings 'recursion'; $c->dispatcher->forward( $c, @_ ) }
435
436 =head2 $c->detach( $action [, \@arguments ] )
437
438 =head2 $c->detach( $class, $method, [, \@arguments ] )
439
440 =head2 $c->detach()
441
442 The same as L<< forward|/"$c->forward( $action [, \@arguments ] )" >>, but
443 doesn't return to the previous action when processing is finished.
444
445 When called with no arguments it escapes the processing chain entirely.
446
447 =cut
448
449 sub detach { my $c = shift; $c->dispatcher->detach( $c, @_ ) }
450
451 =head2 $c->visit( $action [, \@arguments ] )
452
453 =head2 $c->visit( $action [, \@captures, \@arguments ] )
454
455 =head2 $c->visit( $class, $method, [, \@arguments ] )
456
457 =head2 $c->visit( $class, $method, [, \@captures, \@arguments ] )
458
459 Almost the same as L<< forward|/"$c->forward( $action [, \@arguments ] )" >>,
460 but does a full dispatch, instead of just calling the new C<$action> /
461 C<< $class->$method >>. This means that C<begin>, C<auto> and the method
462 you go to are called, just like a new request.
463
464 In addition both C<< $c->action >> and C<< $c->namespace >> are localized.
465 This means, for example, that C<< $c->action >> methods such as
466 L<name|Catalyst::Action/name>, L<class|Catalyst::Action/class> and
467 L<reverse|Catalyst::Action/reverse> return information for the visited action
468 when they are invoked within the visited action.  This is different from the
469 behavior of L<< forward|/"$c->forward( $action [, \@arguments ] )" >>, which
470 continues to use the $c->action object from the caller action even when
471 invoked from the called action.
472
473 C<< $c->stash >> is kept unchanged.
474
475 In effect, L<< visit|/"$c->visit( $action [, \@captures, \@arguments ] )" >>
476 allows you to "wrap" another action, just as it would have been called by
477 dispatching from a URL, while the analogous
478 L<< go|/"$c->go( $action [, \@captures, \@arguments ] )" >> allows you to
479 transfer control to another action as if it had been reached directly from a URL.
480
481 =cut
482
483 sub visit { my $c = shift; $c->dispatcher->visit( $c, @_ ) }
484
485 =head2 $c->go( $action [, \@arguments ] )
486
487 =head2 $c->go( $action [, \@captures, \@arguments ] )
488
489 =head2 $c->go( $class, $method, [, \@arguments ] )
490
491 =head2 $c->go( $class, $method, [, \@captures, \@arguments ] )
492
493 The relationship between C<go> and
494 L<< visit|/"$c->visit( $action [, \@captures, \@arguments ] )" >> is the same as
495 the relationship between
496 L<< forward|/"$c->forward( $class, $method, [, \@arguments ] )" >> and
497 L<< detach|/"$c->detach( $action [, \@arguments ] )" >>. Like C<< $c->visit >>,
498 C<< $c->go >> will perform a full dispatch on the specified action or method,
499 with localized C<< $c->action >> and C<< $c->namespace >>. Like C<detach>,
500 C<go> escapes the processing of the current request chain on completion, and
501 does not return to its cunless blessed $cunless blessed $caller.
502
503 @arguments are arguments to the final destination of $action. @captures are
504 arguments to the intermediate steps, if any, on the way to the final sub of
505 $action.
506
507 =cut
508
509 sub go { my $c = shift; $c->dispatcher->go( $c, @_ ) }
510
511 =head2 $c->response
512
513 =head2 $c->res
514
515 Returns the current L<Catalyst::Response> object, see there for details.
516
517 =head2 $c->stash
518
519 Returns a hashref to the stash, which may be used to store data and pass
520 it between components during a request. You can also set hash keys by
521 passing arguments. The stash is automatically sent to the view. The
522 stash is cleared at the end of a request; it cannot be used for
523 persistent storage (for this you must use a session; see
524 L<Catalyst::Plugin::Session> for a complete system integrated with
525 Catalyst).
526
527     $c->stash->{foo} = $bar;
528     $c->stash( { moose => 'majestic', qux => 0 } );
529     $c->stash( bar => 1, gorch => 2 ); # equivalent to passing a hashref
530
531     # stash is automatically passed to the view for use in a template
532     $c->forward( 'MyApp::View::TT' );
533
534 The stash hash is currently stored in the PSGI C<$env> and is managed by
535 L<Catalyst::Middleware::Stash>.  Since it's part of the C<$env> items in
536 the stash can be accessed in sub applications mounted under your main
537 L<Catalyst> application.  For example if you delegate the response of an
538 action to another L<Catalyst> application, that sub application will have
539 access to all the stash keys of the main one, and if can of course add
540 more keys of its own.  However those new keys will not 'bubble' back up
541 to the main application.
542
543 For more information the best thing to do is to review the test case:
544 t/middleware-stash.t in the distribution /t directory.
545
546 =cut
547
548 sub stash {
549   my $c = shift;
550   $c->log->error("You are requesting the stash but you don't have a context") unless blessed $c;
551   return Catalyst::Middleware::Stash::get_stash($c->req->env)->(@_);
552 }
553
554 =head2 $c->error
555
556 =head2 $c->error($error, ...)
557
558 =head2 $c->error($arrayref)
559
560 Returns an arrayref containing error messages.  If Catalyst encounters an
561 error while processing a request, it stores the error in $c->error.  This
562 method should only be used to store fatal error messages.
563
564     my @error = @{ $c->error };
565
566 Add a new error.
567
568     $c->error('Something bad happened');
569
570 Calling this will always return an arrayref (if there are no errors it
571 will be an empty arrayref.
572
573 =cut
574
575 sub error {
576     my $c = shift;
577     if ( $_[0] ) {
578         my $error = ref $_[0] eq 'ARRAY' ? $_[0] : [@_];
579         croak @$error unless ref $c;
580         push @{ $c->{error} }, @$error;
581     }
582     elsif ( defined $_[0] ) { $c->{error} = undef }
583     return $c->{error} || [];
584 }
585
586
587 =head2 $c->state
588
589 Contains the return value of the last executed action.
590 Note that << $c->state >> operates in a scalar context which means that all
591 values it returns are scalar.
592
593 =head2 $c->clear_errors
594
595 Clear errors.  You probably don't want to clear the errors unless you are
596 implementing a custom error screen.
597
598 This is equivalent to running
599
600     $c->error(0);
601
602 =cut
603
604 sub clear_errors {
605     my $c = shift;
606     $c->error(0);
607 }
608
609 =head2 $c->has_errors
610
611 Returns true if you have errors
612
613 =cut
614
615 sub has_errors { scalar(@{shift->error}) ? 1:0 }
616
617 =head2 $c->last_error
618
619 Returns the most recent error in the stack (the one most recently added...)
620 or nothing if there are no errors.
621
622 =cut
623
624 sub last_error { my ($err, @errs) = @{shift->error}; return $err }
625
626 =head2 shift_errors
627
628 shifts the most recently added error off the error stack and returns if.  Returns
629 nothing if there are no more errors.
630
631 =cut
632
633 sub shift_errors {
634     my ($self) = @_;
635     my ($err, @errors) = @{$self->error};
636     $self->{error} = \@errors;
637     return $err;
638 }
639
640 sub _comp_search_prefixes {
641     my $c = shift;
642     return map $c->components->{ $_ }, $c->_comp_names_search_prefixes(@_);
643 }
644
645 # search components given a name and some prefixes
646 sub _comp_names_search_prefixes {
647     my ( $c, $name, @prefixes ) = @_;
648     my $appclass = ref $c || $c;
649     my $filter   = "^${appclass}::(" . join( '|', @prefixes ) . ')::';
650     $filter = qr/$filter/; # Compile regex now rather than once per loop
651
652     # map the original component name to the sub part that we will search against
653     my %eligible = map { my $n = $_; $n =~ s{^$appclass\::[^:]+::}{}; $_ => $n; }
654         grep { /$filter/ } keys %{ $c->components };
655
656     # undef for a name will return all
657     return keys %eligible if !defined $name;
658
659     my $query  = $name->$_isa('Regexp') ? $name : qr/^$name$/i;
660     my @result = grep { $eligible{$_} =~ m{$query} } keys %eligible;
661
662     return @result if @result;
663
664     # if we were given a regexp to search against, we're done.
665     return if $name->$_isa('Regexp');
666
667     # skip regexp fallback if configured
668     return
669         if $appclass->config->{disable_component_resolution_regex_fallback};
670
671     # regexp fallback
672     $query  = qr/$name/i;
673     @result = grep { $eligible{ $_ } =~ m{$query} } keys %eligible;
674
675     # no results? try against full names
676     if( !@result ) {
677         @result = grep { m{$query} } keys %eligible;
678     }
679
680     # don't warn if we didn't find any results, it just might not exist
681     if( @result ) {
682         # Disgusting hack to work out correct method name
683         my $warn_for = lc $prefixes[0];
684         my $msg = "Used regexp fallback for \$c->${warn_for}('${name}'), which found '" .
685            (join '", "', @result) . "'. Relying on regexp fallback behavior for " .
686            "component resolution is unreliable and unsafe.";
687         my $short = $result[0];
688         # remove the component namespace prefix
689         $short =~ s/.*?(Model|Controller|View):://;
690         my $shortmess = Carp::shortmess('');
691         if ($shortmess =~ m#Catalyst/Plugin#) {
692            $msg .= " You probably need to set '$short' instead of '${name}' in this " .
693               "plugin's config";
694         } elsif ($shortmess =~ m#Catalyst/lib/(View|Controller)#) {
695            $msg .= " You probably need to set '$short' instead of '${name}' in this " .
696               "component's config";
697         } else {
698            $msg .= " You probably meant \$c->${warn_for}('$short') instead of \$c->${warn_for}('${name}'), " .
699               "but if you really wanted to search, pass in a regexp as the argument " .
700               "like so: \$c->${warn_for}(qr/${name}/)";
701         }
702         $c->log->warn( "${msg}$shortmess" );
703     }
704
705     return @result;
706 }
707
708 # Find possible names for a prefix
709 sub _comp_names {
710     my ( $c, @prefixes ) = @_;
711     my $appclass = ref $c || $c;
712
713     my $filter = "^${appclass}::(" . join( '|', @prefixes ) . ')::';
714
715     my @names = map { s{$filter}{}; $_; }
716         $c->_comp_names_search_prefixes( undef, @prefixes );
717
718     return @names;
719 }
720
721 # Filter a component before returning by calling ACCEPT_CONTEXT if available
722
723 sub _filter_component {
724     my ( $c, $comp, @args ) = @_;
725
726     if(ref $comp eq 'CODE') {
727       $comp = $comp->();
728     }
729
730     if ( eval { $comp->can('ACCEPT_CONTEXT'); } ) {
731       return $comp->ACCEPT_CONTEXT( $c, @args );
732     }
733
734     $c->log->warn("You called component '${\$comp->catalyst_component_name}' with arguments [@args], but this component does not ACCEPT_CONTEXT, so args are ignored.") if scalar(@args) && $c->debug;
735
736     return $comp;
737 }
738
739 =head2 COMPONENT ACCESSORS
740
741 =head2 $c->controller($name)
742
743 Gets a L<Catalyst::Controller> instance by name.
744
745     $c->controller('Foo')->do_stuff;
746
747 If the name is omitted, will return the controller for the dispatched
748 action.
749
750 If you want to search for controllers, pass in a regexp as the argument.
751
752     # find all controllers that start with Foo
753     my @foo_controllers = $c->controller(qr{^Foo});
754
755
756 =cut
757
758 sub controller {
759     my ( $c, $name, @args ) = @_;
760
761     my $appclass = ref($c) || $c;
762     if( $name ) {
763         unless ( $name->$_isa('Regexp') ) { # Direct component hash lookup to avoid costly regexps
764             my $comps = $c->components;
765             my $check = $appclass."::Controller::".$name;
766             return $c->_filter_component( $comps->{$check}, @args ) if exists $comps->{$check};
767         }
768         my @result = $c->_comp_search_prefixes( $name, qw/Controller C/ );
769         return map { $c->_filter_component( $_, @args ) } @result if ref $name;
770         return $c->_filter_component( $result[ 0 ], @args );
771     }
772
773     return $c->component( $c->action->class );
774 }
775
776 =head2 $c->model($name)
777
778 Gets a L<Catalyst::Model> instance by name.
779
780     $c->model('Foo')->do_stuff;
781
782 Any extra arguments are directly passed to ACCEPT_CONTEXT, if the model
783 defines ACCEPT_CONTEXT.  If it does not, the args are discarded.
784
785 If the name is omitted, it will look for
786  - a model object in $c->stash->{current_model_instance}, then
787  - a model name in $c->stash->{current_model}, then
788  - a config setting 'default_model', or
789  - check if there is only one model, and return it if that's the case.
790
791 If you want to search for models, pass in a regexp as the argument.
792
793     # find all models that start with Foo
794     my @foo_models = $c->model(qr{^Foo});
795
796 =cut
797
798 sub model {
799     my ( $c, $name, @args ) = @_;
800     my $appclass = ref($c) || $c;
801     if( $name ) {
802         unless ( $name->$_isa('Regexp') ) { # Direct component hash lookup to avoid costly regexps
803             my $comps = $c->components;
804             my $check = $appclass."::Model::".$name;
805             return $c->_filter_component( $comps->{$check}, @args ) if exists $comps->{$check};
806         }
807         my @result = $c->_comp_search_prefixes( $name, qw/Model M/ );
808         return map { $c->_filter_component( $_, @args ) } @result if ref $name;
809         return $c->_filter_component( $result[ 0 ], @args );
810     }
811
812     if (ref $c) {
813         return $c->stash->{current_model_instance}
814           if $c->stash->{current_model_instance};
815         return $c->model( $c->stash->{current_model} )
816           if $c->stash->{current_model};
817     }
818     return $c->model( $appclass->config->{default_model} )
819       if $appclass->config->{default_model};
820
821     my( $comp, $rest ) = $c->_comp_search_prefixes( undef, qw/Model M/);
822
823     if( $rest ) {
824         $c->log->warn( Carp::shortmess('Calling $c->model() will return a random model unless you specify one of:') );
825         $c->log->warn( '* $c->config(default_model => "the name of the default model to use")' );
826         $c->log->warn( '* $c->stash->{current_model} # the name of the model to use for this request' );
827         $c->log->warn( '* $c->stash->{current_model_instance} # the instance of the model to use for this request' );
828         $c->log->warn( 'NB: in version 5.81, the "random" behavior will not work at all.' );
829     }
830
831     return $c->_filter_component( $comp );
832 }
833
834
835 =head2 $c->view($name)
836
837 Gets a L<Catalyst::View> instance by name.
838
839     $c->view('Foo')->do_stuff;
840
841 Any extra arguments are directly passed to ACCEPT_CONTEXT.
842
843 If the name is omitted, it will look for
844  - a view object in $c->stash->{current_view_instance}, then
845  - a view name in $c->stash->{current_view}, then
846  - a config setting 'default_view', or
847  - check if there is only one view, and return it if that's the case.
848
849 If you want to search for views, pass in a regexp as the argument.
850
851     # find all views that start with Foo
852     my @foo_views = $c->view(qr{^Foo});
853
854 =cut
855
856 sub view {
857     my ( $c, $name, @args ) = @_;
858
859     my $appclass = ref($c) || $c;
860     if( $name ) {
861         unless ( $name->$_isa('Regexp') ) { # Direct component hash lookup to avoid costly regexps
862             my $comps = $c->components;
863             my $check = $appclass."::View::".$name;
864             if( exists $comps->{$check} ) {
865                 return $c->_filter_component( $comps->{$check}, @args );
866             }
867             else {
868                 $c->log->warn( "Attempted to use view '$check', but does not exist" );
869             }
870         }
871         my @result = $c->_comp_search_prefixes( $name, qw/View V/ );
872         return map { $c->_filter_component( $_, @args ) } @result if ref $name;
873         return $c->_filter_component( $result[ 0 ], @args );
874     }
875
876     if (ref $c) {
877         return $c->stash->{current_view_instance}
878           if $c->stash->{current_view_instance};
879         return $c->view( $c->stash->{current_view} )
880           if $c->stash->{current_view};
881     }
882     return $c->view( $appclass->config->{default_view} )
883       if $appclass->config->{default_view};
884
885     my( $comp, $rest ) = $c->_comp_search_prefixes( undef, qw/View V/);
886
887     if( $rest ) {
888         $c->log->warn( 'Calling $c->view() will return a random view unless you specify one of:' );
889         $c->log->warn( '* $c->config(default_view => "the name of the default view to use")' );
890         $c->log->warn( '* $c->stash->{current_view} # the name of the view to use for this request' );
891         $c->log->warn( '* $c->stash->{current_view_instance} # the instance of the view to use for this request' );
892         $c->log->warn( 'NB: in version 5.81, the "random" behavior will not work at all.' );
893     }
894
895     return $c->_filter_component( $comp );
896 }
897
898 =head2 $c->controllers
899
900 Returns the available names which can be passed to $c->controller
901
902 =cut
903
904 sub controllers {
905     my ( $c ) = @_;
906     return $c->_comp_names(qw/Controller C/);
907 }
908
909 =head2 $c->models
910
911 Returns the available names which can be passed to $c->model
912
913 =cut
914
915 sub models {
916     my ( $c ) = @_;
917     return $c->_comp_names(qw/Model M/);
918 }
919
920
921 =head2 $c->views
922
923 Returns the available names which can be passed to $c->view
924
925 =cut
926
927 sub views {
928     my ( $c ) = @_;
929     return $c->_comp_names(qw/View V/);
930 }
931
932 =head2 $c->comp($name)
933
934 =head2 $c->component($name)
935
936 Gets a component object by name. This method is not recommended,
937 unless you want to get a specific component by full
938 class. C<< $c->controller >>, C<< $c->model >>, and C<< $c->view >>
939 should be used instead.
940
941 If C<$name> is a regexp, a list of components matched against the full
942 component name will be returned.
943
944 If Catalyst can't find a component by name, it will fallback to regex
945 matching by default. To disable this behaviour set
946 disable_component_resolution_regex_fallback to a true value.
947
948     __PACKAGE__->config( disable_component_resolution_regex_fallback => 1 );
949
950 =cut
951
952 sub component {
953     my ( $c, $name, @args ) = @_;
954
955     if( $name ) {
956         my $comps = $c->components;
957
958         if( !ref $name ) {
959             # is it the exact name?
960             return $c->_filter_component( $comps->{ $name }, @args )
961                        if exists $comps->{ $name };
962
963             # perhaps we just omitted "MyApp"?
964             my $composed = ( ref $c || $c ) . "::${name}";
965             return $c->_filter_component( $comps->{ $composed }, @args )
966                        if exists $comps->{ $composed };
967
968             # search all of the models, views and controllers
969             my( $comp ) = $c->_comp_search_prefixes( $name, qw/Model M Controller C View V/ );
970             return $c->_filter_component( $comp, @args ) if $comp;
971         }
972
973         return
974             if $c->config->{disable_component_resolution_regex_fallback};
975
976         # This is here so $c->comp( '::M::' ) works
977         my $query = ref $name ? $name : qr{$name}i;
978
979         my @result = grep { m{$query} } keys %{ $c->components };
980         return map { $c->_filter_component( $_, @args ) } @result if ref $name;
981
982         if( $result[ 0 ] ) {
983             $c->log->warn( Carp::shortmess(qq(Found results for "${name}" using regexp fallback)) );
984             $c->log->warn( 'Relying on the regexp fallback behavior for component resolution' );
985             $c->log->warn( 'is unreliable and unsafe. You have been warned' );
986             return $c->_filter_component( $result[ 0 ], @args );
987         }
988
989         # I would expect to return an empty list here, but that breaks back-compat
990     }
991
992     # fallback
993     return sort keys %{ $c->components };
994 }
995
996 =head2 CLASS DATA AND HELPER CLASSES
997
998 =head2 $c->config
999
1000 Returns or takes a hashref containing the application's configuration.
1001
1002     __PACKAGE__->config( { db => 'dsn:SQLite:foo.db' } );
1003
1004 You can also use a C<YAML>, C<XML> or L<Config::General> config file
1005 like C<myapp.conf> in your applications home directory. See
1006 L<Catalyst::Plugin::ConfigLoader>.
1007
1008 =head3 Cascading configuration
1009
1010 The config method is present on all Catalyst components, and configuration
1011 will be merged when an application is started. Configuration loaded with
1012 L<Catalyst::Plugin::ConfigLoader> takes precedence over other configuration,
1013 followed by configuration in your top level C<MyApp> class. These two
1014 configurations are merged, and then configuration data whose hash key matches a
1015 component name is merged with configuration for that component.
1016
1017 The configuration for a component is then passed to the C<new> method when a
1018 component is constructed.
1019
1020 For example:
1021
1022     MyApp->config({ 'Model::Foo' => { bar => 'baz', overrides => 'me' } });
1023     MyApp::Model::Foo->config({ quux => 'frob', overrides => 'this' });
1024
1025 will mean that C<MyApp::Model::Foo> receives the following data when
1026 constructed:
1027
1028     MyApp::Model::Foo->new({
1029         bar => 'baz',
1030         quux => 'frob',
1031         overrides => 'me',
1032     });
1033
1034 It's common practice to use a Moose attribute
1035 on the receiving component to access the config value.
1036
1037     package MyApp::Model::Foo;
1038
1039     use Moose;
1040
1041     # this attr will receive 'baz' at construction time
1042     has 'bar' => (
1043         is  => 'rw',
1044         isa => 'Str',
1045     );
1046
1047 You can then get the value 'baz' by calling $c->model('Foo')->bar
1048 (or $self->bar inside code in the model).
1049
1050 B<NOTE:> you MUST NOT call C<< $self->config >> or C<< __PACKAGE__->config >>
1051 as a way of reading config within your code, as this B<will not> give you the
1052 correctly merged config back. You B<MUST> take the config values supplied to
1053 the constructor and use those instead.
1054
1055 =cut
1056
1057 around config => sub {
1058     my $orig = shift;
1059     my $c = shift;
1060
1061     croak('Setting config after setup has been run is not allowed.')
1062         if ( @_ and $c->setup_finished );
1063
1064     $c->$orig(@_);
1065 };
1066
1067 =head2 $c->log
1068
1069 Returns the logging object instance. Unless it is already set, Catalyst
1070 sets this up with a L<Catalyst::Log> object. To use your own log class,
1071 set the logger with the C<< __PACKAGE__->log >> method prior to calling
1072 C<< __PACKAGE__->setup >>.
1073
1074  __PACKAGE__->log( MyLogger->new );
1075  __PACKAGE__->setup;
1076
1077 And later:
1078
1079     $c->log->info( 'Now logging with my own logger!' );
1080
1081 Your log class should implement the methods described in
1082 L<Catalyst::Log>.
1083
1084 =head2 has_encoding
1085
1086 Returned True if there's a valid encoding
1087
1088 =head2 clear_encoding
1089
1090 Clears the encoding for the current context
1091
1092 =head2 encoding
1093
1094 Sets or gets the application encoding.  Setting encoding takes either an
1095 Encoding object or a string that we try to resolve via L<Encode::find_encoding>.
1096
1097 You would expect to get the encoding object back if you attempt to set it.  If
1098 there is a failure you will get undef returned and an error message in the log.
1099
1100 =cut
1101
1102 sub has_encoding { shift->encoding ? 1:0 }
1103
1104 sub clear_encoding {
1105     my $c = shift;
1106     if(blessed $c) {
1107         $c->encoding(undef);
1108     } else {
1109         $c->log->error("You can't clear encoding on the application");
1110     }
1111 }
1112
1113 sub encoding {
1114     my $c = shift;
1115     my $encoding;
1116
1117     if ( scalar @_ ) {
1118
1119         # Don't let one change this once we are too far into the response
1120         if(blessed $c && $c->res->finalized_headers) {
1121           Carp::croak("You may not change the encoding once the headers are finalized");
1122           return;
1123         }
1124
1125         # Let it be set to undef
1126         if (my $wanted = shift)  {
1127             $encoding = Encode::find_encoding($wanted)
1128               or Carp::croak( qq/Unknown encoding '$wanted'/ );
1129             binmode(STDERR, ':encoding(' . $encoding->name . ')');
1130         }
1131         else {
1132             binmode(STDERR);
1133         }
1134
1135         $encoding = ref $c
1136                   ? $c->{encoding} = $encoding
1137                   : $c->_encoding($encoding);
1138     } else {
1139       $encoding = ref $c && exists $c->{encoding}
1140                 ? $c->{encoding}
1141                 : $c->_encoding;
1142     }
1143
1144     return $encoding;
1145 }
1146
1147 =head2 $c->debug
1148
1149 Returns 1 if debug mode is enabled, 0 otherwise.
1150
1151 You can enable debug mode in several ways:
1152
1153 =over
1154
1155 =item By calling myapp_server.pl with the -d flag
1156
1157 =item With the environment variables MYAPP_DEBUG, or CATALYST_DEBUG
1158
1159 =item The -Debug option in your MyApp.pm
1160
1161 =item By declaring C<sub debug { 1 }> in your MyApp.pm.
1162
1163 =back
1164
1165 The first three also set the log level to 'debug'.
1166
1167 Calling C<< $c->debug(1) >> has no effect.
1168
1169 =cut
1170
1171 sub debug { 0 }
1172
1173 =head2 $c->dispatcher
1174
1175 Returns the dispatcher instance. See L<Catalyst::Dispatcher>.
1176
1177 =head2 $c->engine
1178
1179 Returns the engine instance. See L<Catalyst::Engine>.
1180
1181
1182 =head2 UTILITY METHODS
1183
1184 =head2 $c->path_to(@path)
1185
1186 Merges C<@path> with C<< $c->config->{home} >> and returns a
1187 L<Path::Class::Dir> object. Note you can usually use this object as
1188 a filename, but sometimes you will have to explicitly stringify it
1189 yourself by calling the C<< ->stringify >> method.
1190
1191 For example:
1192
1193     $c->path_to( 'db', 'sqlite.db' );
1194
1195 =cut
1196
1197 sub path_to {
1198     my ( $c, @path ) = @_;
1199     my $path = Path::Class::Dir->new( $c->config->{home}, @path );
1200     if ( -d $path ) { return $path }
1201     else { return Path::Class::File->new( $c->config->{home}, @path ) }
1202 }
1203
1204 sub plugin {
1205     my ( $class, $name, $plugin, @args ) = @_;
1206
1207     # See block comment in t/unit_core_plugin.t
1208     $class->log->warn(qq/Adding plugin using the ->plugin method is deprecated, and will be removed in a future release/);
1209
1210     $class->_register_plugin( $plugin, 1 );
1211
1212     eval { $plugin->import };
1213     $class->mk_classdata($name);
1214     my $obj;
1215     eval { $obj = $plugin->new(@args) };
1216
1217     if ($@) {
1218         Catalyst::Exception->throw( message =>
1219               qq/Couldn't instantiate instant plugin "$plugin", "$@"/ );
1220     }
1221
1222     $class->$name($obj);
1223     $class->log->debug(qq/Initialized instant plugin "$plugin" as "$name"/)
1224       if $class->debug;
1225 }
1226
1227 =head2 MyApp->setup
1228
1229 Initializes the dispatcher and engine, loads any plugins, and loads the
1230 model, view, and controller components. You may also specify an array
1231 of plugins to load here, if you choose to not load them in the C<use
1232 Catalyst> line.
1233
1234     MyApp->setup;
1235     MyApp->setup( qw/-Debug/ );
1236
1237 B<Note:> You B<should not> wrap this method with method modifiers
1238 or bad things will happen - wrap the C<setup_finalize> method instead.
1239
1240 B<Note:> You can create a custom setup stage that will execute when the
1241 application is starting.  Use this to customize setup.
1242
1243     MyApp->setup(-Custom=value);
1244
1245     sub setup_custom {
1246       my ($class, $value) = @_;
1247     }
1248
1249 Can be handy if you want to hook into the setup phase.
1250
1251 =cut
1252
1253 sub setup {
1254     my ( $class, @arguments ) = @_;
1255     croak('Running setup more than once')
1256         if ( $class->setup_finished );
1257
1258     unless ( $class->isa('Catalyst') ) {
1259
1260         Catalyst::Exception->throw(
1261             message => qq/'$class' does not inherit from Catalyst/ );
1262     }
1263
1264     if ( $class->arguments ) {
1265         @arguments = ( @arguments, @{ $class->arguments } );
1266     }
1267
1268     # Process options
1269     my $flags = {};
1270
1271     foreach (@arguments) {
1272
1273         if (/^-Debug$/) {
1274             $flags->{log} =
1275               ( $flags->{log} ) ? 'debug,' . $flags->{log} : 'debug';
1276         }
1277         elsif (/^-(\w+)=?(.*)$/) {
1278             $flags->{ lc $1 } = $2;
1279         }
1280         else {
1281             push @{ $flags->{plugins} }, $_;
1282         }
1283     }
1284
1285     $class->setup_home( delete $flags->{home} );
1286
1287     $class->setup_log( delete $flags->{log} );
1288     $class->setup_plugins( delete $flags->{plugins} );
1289
1290     $class->setup_data_handlers();
1291     $class->setup_dispatcher( delete $flags->{dispatcher} );
1292     if (my $engine = delete $flags->{engine}) {
1293         $class->log->warn("Specifying the engine in ->setup is no longer supported, see Catalyst::Upgrading");
1294     }
1295     $class->setup_engine();
1296     $class->setup_stats( delete $flags->{stats} );
1297
1298     for my $flag ( sort keys %{$flags} ) {
1299
1300         if ( my $code = $class->can( 'setup_' . $flag ) ) {
1301             &$code( $class, delete $flags->{$flag} );
1302         }
1303         else {
1304             $class->log->warn(qq/Unknown flag "$flag"/);
1305         }
1306     }
1307
1308     eval { require Catalyst::Devel; };
1309     if( !$@ && $ENV{CATALYST_SCRIPT_GEN} && ( $ENV{CATALYST_SCRIPT_GEN} < $Catalyst::Devel::CATALYST_SCRIPT_GEN ) ) {
1310         $class->log->warn(<<"EOF");
1311 You are running an old script!
1312
1313   Please update by running (this will overwrite existing files):
1314     catalyst.pl -force -scripts $class
1315
1316   or (this will not overwrite existing files):
1317     catalyst.pl -scripts $class
1318
1319 EOF
1320     }
1321
1322     # Call plugins setup, this is stupid and evil.
1323     # Also screws C3 badly on 5.10, hack to avoid.
1324     {
1325         no warnings qw/redefine/;
1326         local *setup = sub { };
1327         $class->setup unless $Catalyst::__AM_RESTARTING;
1328     }
1329
1330     # If you are expecting configuration info as part of your setup, it needs
1331     # to get called here and below, since we need the above line to support
1332     # ConfigLoader based configs.
1333
1334     $class->setup_encoding();
1335     $class->setup_middleware();
1336
1337     # Initialize our data structure
1338     $class->components( {} );
1339
1340     $class->setup_components;
1341
1342     if ( $class->debug ) {
1343         my @plugins = map { "$_  " . ( $_->VERSION || '' ) } $class->registered_plugins;
1344
1345         if (@plugins) {
1346             my $column_width = Catalyst::Utils::term_width() - 6;
1347             my $t = Text::SimpleTable->new($column_width);
1348             $t->row($_) for @plugins;
1349             $class->log->debug( "Loaded plugins:\n" . $t->draw . "\n" );
1350         }
1351
1352         my @middleware = map {
1353           ref $_ eq 'CODE' ? 
1354             "Inline Coderef" : 
1355               (ref($_) .'  '. ($_->can('VERSION') ? $_->VERSION || '' : '') 
1356                 || '')  } $class->registered_middlewares;
1357
1358         if (@middleware) {
1359             my $column_width = Catalyst::Utils::term_width() - 6;
1360             my $t = Text::SimpleTable->new($column_width);
1361             $t->row($_) for @middleware;
1362             $class->log->debug( "Loaded PSGI Middleware:\n" . $t->draw . "\n" );
1363         }
1364
1365         my %dh = $class->registered_data_handlers;
1366         if (my @data_handlers = keys %dh) {
1367             my $column_width = Catalyst::Utils::term_width() - 6;
1368             my $t = Text::SimpleTable->new($column_width);
1369             $t->row($_) for @data_handlers;
1370             $class->log->debug( "Loaded Request Data Handlers:\n" . $t->draw . "\n" );
1371         }
1372
1373         my $dispatcher = $class->dispatcher;
1374         my $engine     = $class->engine;
1375         my $home       = $class->config->{home};
1376
1377         $class->log->debug(sprintf(q/Loaded dispatcher "%s"/, blessed($dispatcher)));
1378         $class->log->debug(sprintf(q/Loaded engine "%s"/, blessed($engine)));
1379
1380         $home
1381           ? ( -d $home )
1382           ? $class->log->debug(qq/Found home "$home"/)
1383           : $class->log->debug(qq/Home "$home" doesn't exist/)
1384           : $class->log->debug(q/Couldn't find home/);
1385
1386         my $column_width = Catalyst::Utils::term_width() - 8 - 9;
1387
1388         my $t = Text::SimpleTable->new( [ $column_width, 'Class' ], [ 8, 'Type' ] );
1389         for my $comp ( sort keys %{ $class->components } ) {
1390             my $type = ref $class->components->{$comp} ? 'instance' : 'class';
1391             $t->row( $comp, $type );
1392         }
1393         $class->log->debug( "Loaded components:\n" . $t->draw . "\n" )
1394           if ( keys %{ $class->components } );
1395     }
1396
1397     # Add our self to components, since we are also a component
1398     if( $class->isa('Catalyst::Controller') ){
1399       $class->components->{$class} = $class;
1400     }
1401
1402     $class->setup_actions;
1403
1404     if ( $class->debug ) {
1405         my $name = $class->config->{name} || 'Application';
1406         $class->log->info("$name powered by Catalyst $Catalyst::VERSION");
1407     }
1408
1409     if ($class->config->{case_sensitive}) {
1410         $class->log->warn($class . "->config->{case_sensitive} is set.");
1411         $class->log->warn("This setting is deprecated and planned to be removed in Catalyst 5.81.");
1412     }
1413
1414     $class->setup_finalize;
1415
1416     # Flush the log for good measure (in case something turned off 'autoflush' early)
1417     $class->log->_flush() if $class->log->can('_flush');
1418
1419     return $class || 1; # Just in case someone named their Application 0...
1420 }
1421
1422 =head2 $app->setup_finalize
1423
1424 A hook to attach modifiers to. This method does not do anything except set the
1425 C<setup_finished> accessor.
1426
1427 Applying method modifiers to the C<setup> method doesn't work, because of quirky things done for plugin setup.
1428
1429 Example:
1430
1431     after setup_finalize => sub {
1432         my $app = shift;
1433
1434         ## do stuff here..
1435     };
1436
1437 =cut
1438
1439 sub setup_finalize {
1440     my ($class) = @_;
1441     $class->setup_finished(1);
1442 }
1443
1444 =head2 $c->uri_for( $path?, @args?, \%query_values? )
1445
1446 =head2 $c->uri_for( $action, \@captures?, @args?, \%query_values? )
1447
1448 =head2 $c->uri_for( $action, [@captures, @args], \%query_values? )
1449
1450 Constructs an absolute L<URI> object based on the application root, the
1451 provided path, and the additional arguments and query parameters provided.
1452 When used as a string, provides a textual URI.  If you need more flexibility
1453 than this (i.e. the option to provide relative URIs etc.) see
1454 L<Catalyst::Plugin::SmartURI>.
1455
1456 If no arguments are provided, the URI for the current action is returned.
1457 To return the current action and also provide @args, use
1458 C<< $c->uri_for( $c->action, @args ) >>.
1459
1460 If the first argument is a string, it is taken as a public URI path relative
1461 to C<< $c->namespace >> (if it doesn't begin with a forward slash) or
1462 relative to the application root (if it does). It is then merged with
1463 C<< $c->request->base >>; any C<@args> are appended as additional path
1464 components; and any C<%query_values> are appended as C<?foo=bar> parameters.
1465
1466 If the first argument is a L<Catalyst::Action> it represents an action which
1467 will have its path resolved using C<< $c->dispatcher->uri_for_action >>. The
1468 optional C<\@captures> argument (an arrayref) allows passing the captured
1469 variables that are needed to fill in the paths of Chained and Regex actions;
1470 once the path is resolved, C<uri_for> continues as though a path was
1471 provided, appending any arguments or parameters and creating an absolute
1472 URI.
1473
1474 The captures for the current request can be found in
1475 C<< $c->request->captures >>, and actions can be resolved using
1476 C<< Catalyst::Controller->action_for($name) >>. If you have a private action
1477 path, use C<< $c->uri_for_action >> instead.
1478
1479   # Equivalent to $c->req->uri
1480   $c->uri_for($c->action, $c->req->captures,
1481       @{ $c->req->args }, $c->req->params);
1482
1483   # For the Foo action in the Bar controller
1484   $c->uri_for($c->controller('Bar')->action_for('Foo'));
1485
1486   # Path to a static resource
1487   $c->uri_for('/static/images/logo.png');
1488
1489 In general the scheme of the generated URI object will follow the incoming request
1490 however if your targeted action or action chain has the Scheme attribute it will
1491 use that instead.
1492
1493 Also, if the targeted Action or Action chain declares Args/CaptureArgs that have
1494 type constraints, we will require that your proposed URL verify on those declared
1495 constraints.
1496
1497 =cut
1498
1499 sub uri_for {
1500     my ( $c, $path, @args ) = @_;
1501
1502     if ( $path->$_isa('Catalyst::Controller') ) {
1503         $path = $path->path_prefix;
1504         $path =~ s{/+\z}{};
1505         $path .= '/';
1506     }
1507
1508     undef($path) if (defined $path && $path eq '');
1509
1510     my $params =
1511       ( scalar @args && ref $args[$#args] eq 'HASH' ? pop @args : {} );
1512
1513     carp "uri_for called with undef argument" if grep { ! defined $_ } @args;
1514
1515     my $target_action = $path->$_isa('Catalyst::Action') ? $path : undef;
1516     if ( $path->$_isa('Catalyst::Action') ) { # action object
1517         s|/|%2F|g for @args;
1518         my $captures = [ map { s|/|%2F|g; $_; }
1519                         ( scalar @args && ref $args[0] eq 'ARRAY'
1520                          ? @{ shift(@args) }
1521                          : ()) ];
1522
1523         my $action = $path;
1524         my $expanded_action = $c->dispatcher->expand_action( $action );
1525         my $num_captures = $expanded_action->number_of_captures;
1526
1527         # ->uri_for( $action, \@captures_and_args, \%query_values? )
1528         if( !@args && $action->number_of_args ) {
1529           unshift @args, splice @$captures, $num_captures;
1530         }
1531
1532         if($num_captures) {
1533           unless($expanded_action->match_captures_constraints($c, $captures)) {
1534             carp "captures [@{$captures}] do not match the type constraints in actionchain ending with '$expanded_action'";
1535             return;
1536           }
1537         }
1538
1539         $path = $c->dispatcher->uri_for_action($action, $captures);
1540         if (not defined $path) {
1541             $c->log->debug(qq/Can't find uri_for action '$action' @$captures/)
1542                 if $c->debug;
1543             return undef;
1544         }
1545         $path = '/' if $path eq '';
1546
1547         # At this point @encoded_args is the remaining Args (all captures removed).
1548         if($expanded_action->has_args_constraints) {
1549           unless($expanded_action->match_args($c,\@args)) {
1550              carp "args [@args] do not match the type constraints in action '$expanded_action'";
1551              return;
1552           }
1553         }
1554     }
1555
1556     unshift(@args, $path);
1557
1558     unless (defined $path && $path =~ s!^/!!) { # in-place strip
1559         my $namespace = $c->namespace;
1560         if (defined $path) { # cheesy hack to handle path '../foo'
1561            $namespace =~ s{(?:^|/)[^/]+$}{} while $args[0] =~ s{^\.\./}{};
1562         }
1563         unshift(@args, $namespace || '');
1564     }
1565
1566     # join args with '/', or a blank string
1567     my $args = join('/', grep { defined($_) } @args);
1568     $args =~ s/\?/%3F/g; # STUPID STUPID SPECIAL CASE
1569     $args =~ s!^/+!!;
1570
1571     my ($base, $class) = ('/', 'URI::_generic');
1572     if(blessed($c)) {
1573       $base = $c->req->base;
1574       if($target_action) {
1575         $target_action = $c->dispatcher->expand_action($target_action);
1576         if(my $s = $target_action->scheme) {
1577           $s = lc($s);
1578           $class = "URI::$s";
1579           $base->scheme($s);
1580         } else {
1581           $class = ref($base);
1582         }
1583       } else {
1584         $class = ref($base);
1585       }
1586
1587       $base =~ s{(?<!/)$}{/};
1588     }
1589
1590     my $query = '';
1591
1592     if (my @keys = keys %$params) {
1593       # somewhat lifted from URI::_query's query_form
1594       $query = '?'.join('&', map {
1595           my $val = $params->{$_};
1596           #s/([;\/?:@&=+,\$\[\]%])/$URI::Escape::escapes{$1}/go; ## Commented out because seems to lead to double encoding - JNAP
1597           s/ /+/g;
1598           my $key = $_;
1599           $val = '' unless defined $val;
1600           (map {
1601               my $param = "$_";
1602               $param = encode_utf8($param);
1603               # using the URI::Escape pattern here so utf8 chars survive
1604               $param =~ s/([^A-Za-z0-9\-_.!~*'() ])/$URI::Escape::escapes{$1}/go;
1605               $param =~ s/ /+/g;
1606
1607               $key = encode_utf8($key);
1608               # using the URI::Escape pattern here so utf8 chars survive
1609               $key =~ s/([^A-Za-z0-9\-_.!~*'() ])/$URI::Escape::escapes{$1}/go;
1610               $key =~ s/ /+/g;
1611
1612               "${key}=$param"; } ( ref $val eq 'ARRAY' ? @$val : $val ));
1613       } @keys);
1614     }
1615
1616     $base = encode_utf8 $base;
1617     $base =~ s/([^$URI::uric])/$URI::Escape::escapes{$1}/go;
1618     $args = encode_utf8 $args;
1619     $args =~ s/([^$URI::uric])/$URI::Escape::escapes{$1}/go;
1620     
1621     my $res = bless(\"${base}${args}${query}", $class);
1622     $res;
1623 }
1624
1625 =head2 $c->uri_for_action( $path, \@captures_and_args?, @args?, \%query_values? )
1626
1627 =head2 $c->uri_for_action( $action, \@captures_and_args?, @args?, \%query_values? )
1628
1629 =over
1630
1631 =item $path
1632
1633 A private path to the Catalyst action you want to create a URI for.
1634
1635 This is a shortcut for calling C<< $c->dispatcher->get_action_by_path($path)
1636 >> and passing the resulting C<$action> and the remaining arguments to C<<
1637 $c->uri_for >>.
1638
1639 You can also pass in a Catalyst::Action object, in which case it is passed to
1640 C<< $c->uri_for >>.
1641
1642 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.
1643
1644 For example, if the action looks like:
1645
1646  package MyApp::Controller::Users;
1647
1648  sub lst : Path('the-list') {}
1649
1650 You can use:
1651
1652  $c->uri_for_action('/users/lst')
1653
1654 and it will create the URI /users/the-list.
1655
1656 =item \@captures_and_args?
1657
1658 Optional array reference of Captures (i.e. C<<CaptureArgs or $c->req->captures>)
1659 and arguments to the request. Usually used with L<Catalyst::DispatchType::Chained>
1660 to interpolate all the parameters in the URI.
1661
1662 =item @args?
1663
1664 Optional list of extra arguments - can be supplied in the
1665 C<< \@captures_and_args? >> array ref, or here - whichever is easier for your
1666 code.
1667
1668 Your action can have zero, a fixed or a variable number of args (e.g.
1669 C<< Args(1) >> for a fixed number or C<< Args() >> for a variable number)..
1670
1671 =item \%query_values?
1672
1673 Optional array reference of query parameters to append. E.g.
1674
1675   { foo => 'bar' }
1676
1677 will generate
1678
1679   /rest/of/your/uri?foo=bar
1680
1681 =back
1682
1683 =cut
1684
1685 sub uri_for_action {
1686     my ( $c, $path, @args ) = @_;
1687     my $action = blessed($path)
1688       ? $path
1689       : $c->dispatcher->get_action_by_path($path);
1690     unless (defined $action) {
1691       croak "Can't find action for path '$path'";
1692     }
1693     return $c->uri_for( $action, @args );
1694 }
1695
1696 =head2 $c->welcome_message
1697
1698 Returns the Catalyst welcome HTML page.
1699
1700 =cut
1701
1702 sub welcome_message {
1703     my $c      = shift;
1704     my $name   = $c->config->{name};
1705     my $logo   = $c->uri_for('/static/images/catalyst_logo.png');
1706     my $prefix = Catalyst::Utils::appprefix( ref $c );
1707     $c->response->content_type('text/html; charset=utf-8');
1708     return <<"EOF";
1709 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
1710     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
1711 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
1712     <head>
1713     <meta http-equiv="Content-Language" content="en" />
1714     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
1715         <title>$name on Catalyst $VERSION</title>
1716         <style type="text/css">
1717             body {
1718                 color: #000;
1719                 background-color: #eee;
1720             }
1721             div#content {
1722                 width: 640px;
1723                 margin-left: auto;
1724                 margin-right: auto;
1725                 margin-top: 10px;
1726                 margin-bottom: 10px;
1727                 text-align: left;
1728                 background-color: #ccc;
1729                 border: 1px solid #aaa;
1730             }
1731             p, h1, h2 {
1732                 margin-left: 20px;
1733                 margin-right: 20px;
1734                 font-family: verdana, tahoma, sans-serif;
1735             }
1736             a {
1737                 font-family: verdana, tahoma, sans-serif;
1738             }
1739             :link, :visited {
1740                     text-decoration: none;
1741                     color: #b00;
1742                     border-bottom: 1px dotted #bbb;
1743             }
1744             :link:hover, :visited:hover {
1745                     color: #555;
1746             }
1747             div#topbar {
1748                 margin: 0px;
1749             }
1750             pre {
1751                 margin: 10px;
1752                 padding: 8px;
1753             }
1754             div#answers {
1755                 padding: 8px;
1756                 margin: 10px;
1757                 background-color: #fff;
1758                 border: 1px solid #aaa;
1759             }
1760             h1 {
1761                 font-size: 0.9em;
1762                 font-weight: normal;
1763                 text-align: center;
1764             }
1765             h2 {
1766                 font-size: 1.0em;
1767             }
1768             p {
1769                 font-size: 0.9em;
1770             }
1771             p img {
1772                 float: right;
1773                 margin-left: 10px;
1774             }
1775             span#appname {
1776                 font-weight: bold;
1777                 font-size: 1.6em;
1778             }
1779         </style>
1780     </head>
1781     <body>
1782         <div id="content">
1783             <div id="topbar">
1784                 <h1><span id="appname">$name</span> on <a href="http://catalyst.perl.org">Catalyst</a>
1785                     $VERSION</h1>
1786              </div>
1787              <div id="answers">
1788                  <p>
1789                  <img src="$logo" alt="Catalyst Logo" />
1790                  </p>
1791                  <p>Welcome to the  world of Catalyst.
1792                     This <a href="http://en.wikipedia.org/wiki/MVC">MVC</a>
1793                     framework will make web development something you had
1794                     never expected it to be: Fun, rewarding, and quick.</p>
1795                  <h2>What to do now?</h2>
1796                  <p>That really depends  on what <b>you</b> want to do.
1797                     We do, however, provide you with a few starting points.</p>
1798                  <p>If you want to jump right into web development with Catalyst
1799                     you might want to start with a tutorial.</p>
1800 <pre>perldoc <a href="https://metacpan.org/module/Catalyst::Manual::Tutorial">Catalyst::Manual::Tutorial</a></code>
1801 </pre>
1802 <p>Afterwards you can go on to check out a more complete look at our features.</p>
1803 <pre>
1804 <code>perldoc <a href="https://metacpan.org/module/Catalyst::Manual::Intro">Catalyst::Manual::Intro</a>
1805 <!-- Something else should go here, but the Catalyst::Manual link seems unhelpful -->
1806 </code></pre>
1807                  <h2>What to do next?</h2>
1808                  <p>Next it's time to write an actual application. Use the
1809                     helper scripts to generate <a href="https://metacpan.org/search?q=Catalyst%3A%3AController">controllers</a>,
1810                     <a href="https://metacpan.org/search?q=Catalyst%3A%3AModel">models</a>, and
1811                     <a href="https://metacpan.org/search?q=Catalyst%3A%3AView">views</a>;
1812                     they can save you a lot of work.</p>
1813                     <pre><code>script/${prefix}_create.pl --help</code></pre>
1814                     <p>Also, be sure to check out the vast and growing
1815                     collection of <a href="http://search.cpan.org/search?query=Catalyst">plugins for Catalyst on CPAN</a>;
1816                     you are likely to find what you need there.
1817                     </p>
1818
1819                  <h2>Need help?</h2>
1820                  <p>Catalyst has a very active community. Here are the main places to
1821                     get in touch with us.</p>
1822                  <ul>
1823                      <li>
1824                          <a href="http://dev.catalyst.perl.org">Wiki</a>
1825                      </li>
1826                      <li>
1827                          <a href="http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst">Mailing-List</a>
1828                      </li>
1829                      <li>
1830                          <a href="irc://irc.perl.org/catalyst">IRC channel #catalyst on irc.perl.org</a>
1831                      </li>
1832                  </ul>
1833                  <h2>In conclusion</h2>
1834                  <p>The Catalyst team hopes you will enjoy using Catalyst as much
1835                     as we enjoyed making it. Please contact us if you have ideas
1836                     for improvement or other feedback.</p>
1837              </div>
1838          </div>
1839     </body>
1840 </html>
1841 EOF
1842 }
1843
1844 =head2 run_options
1845
1846 Contains a hash of options passed from the application script, including
1847 the original ARGV the script received, the processed values from that
1848 ARGV and any extra arguments to the script which were not processed.
1849
1850 This can be used to add custom options to your application's scripts
1851 and setup your application differently depending on the values of these
1852 options.
1853
1854 =head1 INTERNAL METHODS
1855
1856 These methods are not meant to be used by end users.
1857
1858 =head2 $c->components
1859
1860 Returns a hash of components.
1861
1862 =head2 $c->context_class
1863
1864 Returns or sets the context class.
1865
1866 =head2 $c->counter
1867
1868 Returns a hashref containing coderefs and execution counts (needed for
1869 deep recursion detection).
1870
1871 =head2 $c->depth
1872
1873 Returns the number of actions on the current internal execution stack.
1874
1875 =head2 $c->dispatch
1876
1877 Dispatches a request to actions.
1878
1879 =cut
1880
1881 sub dispatch { my $c = shift; $c->dispatcher->dispatch( $c, @_ ) }
1882
1883 =head2 $c->dispatcher_class
1884
1885 Returns or sets the dispatcher class.
1886
1887 =head2 $c->dump_these
1888
1889 Returns a list of 2-element array references (name, structure) pairs
1890 that will be dumped on the error page in debug mode.
1891
1892 =cut
1893
1894 sub dump_these {
1895     my $c = shift;
1896     [ Request => $c->req ],
1897     [ Response => $c->res ],
1898     [ Stash => $c->stash ],
1899     [ Config => $c->config ];
1900 }
1901
1902 =head2 $c->engine_class
1903
1904 Returns or sets the engine class.
1905
1906 =head2 $c->execute( $class, $coderef )
1907
1908 Execute a coderef in given class and catch exceptions. Errors are available
1909 via $c->error.
1910
1911 =cut
1912
1913 sub execute {
1914     my ( $c, $class, $code ) = @_;
1915     $class = $c->component($class) || $class;
1916     $c->state(0);
1917
1918     if ( $c->depth >= $RECURSION ) {
1919         my $action = $code->reverse();
1920         $action = "/$action" unless $action =~ /->/;
1921         my $error = qq/Deep recursion detected calling "${action}"/;
1922         $c->log->error($error);
1923         $c->error($error);
1924         $c->state(0);
1925         return $c->state;
1926     }
1927
1928     my $stats_info = $c->_stats_start_execute( $code ) if $c->use_stats;
1929
1930     push( @{ $c->stack }, $code );
1931
1932     no warnings 'recursion';
1933     # N.B. This used to be combined, but I have seen $c get clobbered if so, and
1934     #      I have no idea how, ergo $ret (which appears to fix the issue)
1935     eval { my $ret = $code->execute( $class, $c, @{ $c->req->args } ) || 0; $c->state( $ret ) };
1936
1937     $c->_stats_finish_execute( $stats_info ) if $c->use_stats and $stats_info;
1938
1939     my $last = pop( @{ $c->stack } );
1940
1941     if ( my $error = $@ ) {
1942         #rethow if this can be handled by middleware
1943         if ( $c->_handle_http_exception($error) ) {
1944             foreach my $err (@{$c->error}) {
1945                 $c->log->error($err);
1946             }
1947             $c->clear_errors;
1948             $c->log->_flush if $c->log->can('_flush');
1949
1950             $error->can('rethrow') ? $error->rethrow : croak $error;
1951         }
1952         if ( blessed($error) and $error->isa('Catalyst::Exception::Detach') ) {
1953             $error->rethrow if $c->depth > 1;
1954         }
1955         elsif ( blessed($error) and $error->isa('Catalyst::Exception::Go') ) {
1956             $error->rethrow if $c->depth > 0;
1957         }
1958         else {
1959             unless ( ref $error ) {
1960                 no warnings 'uninitialized';
1961                 chomp $error;
1962                 my $class = $last->class;
1963                 my $name  = $last->name;
1964                 $error = qq/Caught exception in $class->$name "$error"/;
1965             }
1966             $c->error($error);
1967         }
1968         $c->state(0);
1969     }
1970     return $c->state;
1971 }
1972
1973 sub _stats_start_execute {
1974     my ( $c, $code ) = @_;
1975     my $appclass = ref($c) || $c;
1976     return if ( ( $code->name =~ /^_.*/ )
1977         && ( !$appclass->config->{show_internal_actions} ) );
1978
1979     my $action_name = $code->reverse();
1980     $c->counter->{$action_name}++;
1981
1982     my $action = $action_name;
1983     $action = "/$action" unless $action =~ /->/;
1984
1985     # determine if the call was the result of a forward
1986     # this is done by walking up the call stack and looking for a calling
1987     # sub of Catalyst::forward before the eval
1988     my $callsub = q{};
1989     for my $index ( 2 .. 11 ) {
1990         last
1991         if ( ( caller($index) )[0] eq 'Catalyst'
1992             && ( caller($index) )[3] eq '(eval)' );
1993
1994         if ( ( caller($index) )[3] =~ /forward$/ ) {
1995             $callsub = ( caller($index) )[3];
1996             $action  = "-> $action";
1997             last;
1998         }
1999     }
2000
2001     my $uid = $action_name . $c->counter->{$action_name};
2002
2003     # is this a root-level call or a forwarded call?
2004     if ( $callsub =~ /forward$/ ) {
2005         my $parent = $c->stack->[-1];
2006
2007         # forward, locate the caller
2008         if ( defined $parent && exists $c->counter->{"$parent"} ) {
2009             $c->stats->profile(
2010                 begin  => $action,
2011                 parent => "$parent" . $c->counter->{"$parent"},
2012                 uid    => $uid,
2013             );
2014         }
2015         else {
2016
2017             # forward with no caller may come from a plugin
2018             $c->stats->profile(
2019                 begin => $action,
2020                 uid   => $uid,
2021             );
2022         }
2023     }
2024     else {
2025
2026         # root-level call
2027         $c->stats->profile(
2028             begin => $action,
2029             uid   => $uid,
2030         );
2031     }
2032     return $action;
2033
2034 }
2035
2036 sub _stats_finish_execute {
2037     my ( $c, $info ) = @_;
2038     $c->stats->profile( end => $info );
2039 }
2040
2041 =head2 $c->finalize
2042
2043 Finalizes the request.
2044
2045 =cut
2046
2047 sub finalize {
2048     my $c = shift;
2049
2050     for my $error ( @{ $c->error } ) {
2051         $c->log->error($error);
2052     }
2053
2054     # Support skipping finalize for psgix.io style 'jailbreak'.  Used to support
2055     # stuff like cometd and websockets
2056
2057     if($c->request->_has_io_fh) {
2058       $c->log_response;
2059       return;
2060     }
2061
2062     # Allow engine to handle finalize flow (for POE)
2063     my $engine = $c->engine;
2064     if ( my $code = $engine->can('finalize') ) {
2065         $engine->$code($c);
2066     }
2067     else {
2068
2069         $c->finalize_uploads;
2070
2071         # Error
2072         if ( $#{ $c->error } >= 0 ) {
2073             $c->finalize_error;
2074         }
2075
2076         $c->finalize_encoding;
2077         $c->finalize_headers unless $c->response->finalized_headers;
2078         $c->finalize_body;
2079     }
2080
2081     $c->log_response;
2082
2083     if ($c->use_stats) {
2084         my $elapsed = $c->stats->elapsed;
2085         my $av = $elapsed == 0 ? '??' : sprintf '%.3f', 1 / $elapsed;
2086         $c->log->info(
2087             "Request took ${elapsed}s ($av/s)\n" . $c->stats->report . "\n" );
2088     }
2089
2090     return $c->response->status;
2091 }
2092
2093 =head2 $c->finalize_body
2094
2095 Finalizes body.
2096
2097 =cut
2098
2099 sub finalize_body { my $c = shift; $c->engine->finalize_body( $c, @_ ) }
2100
2101 =head2 $c->finalize_cookies
2102
2103 Finalizes cookies.
2104
2105 =cut
2106
2107 sub finalize_cookies { my $c = shift; $c->engine->finalize_cookies( $c, @_ ) }
2108
2109 =head2 $c->finalize_error
2110
2111 Finalizes error.  If there is only one error in L</error> and it is an object that
2112 does C<as_psgi> or C<code> we rethrow the error and presume it caught by middleware
2113 up the ladder.  Otherwise we return the debugging error page (in debug mode) or we
2114 return the default error page (production mode).
2115
2116 =cut
2117
2118 sub finalize_error {
2119     my $c = shift;
2120     if($#{$c->error} > 0) {
2121         $c->engine->finalize_error( $c, @_ );
2122     } else {
2123         my ($error) = @{$c->error};
2124         if ( $c->_handle_http_exception($error) ) {
2125             # In the case where the error 'knows what it wants', becauses its PSGI
2126             # aware, just rethow and let middleware catch it
2127             $error->can('rethrow') ? $error->rethrow : croak $error;
2128         } else {
2129             $c->engine->finalize_error( $c, @_ )
2130         }
2131     }
2132 }
2133
2134 =head2 $c->finalize_headers
2135
2136 Finalizes headers.
2137
2138 =cut
2139
2140 sub finalize_headers {
2141     my $c = shift;
2142
2143     my $response = $c->response; #accessor calls can add up?
2144
2145     # Check if we already finalized headers
2146     return if $response->finalized_headers;
2147
2148     # Handle redirects
2149     if ( my $location = $response->redirect ) {
2150         $c->log->debug(qq/Redirecting to "$location"/) if $c->debug;
2151         $response->header( Location => $location );
2152     }
2153
2154     # Remove incorrectly added body and content related meta data when returning
2155     # an information response, or a response the is required to not include a body
2156
2157     $c->finalize_cookies;
2158
2159     # This currently is a NOOP but I don't want to remove it since I guess people
2160     # might have Response subclasses that use it for something... (JNAP)
2161     $c->response->finalize_headers();
2162
2163     # Done
2164     $response->finalized_headers(1);
2165 }
2166
2167 =head2 $c->finalize_encoding
2168
2169 Make sure your body is encoded properly IF you set an encoding.  By
2170 default the encoding is UTF-8 but you can disable it by explicitly setting the
2171 encoding configuration value to undef.
2172
2173 We can only encode when the body is a scalar.  Methods for encoding via the
2174 streaming interfaces (such as C<write> and C<write_fh> on L<Catalyst::Response>
2175 are available).
2176
2177 See L</ENCODING>.
2178
2179 =cut
2180
2181 sub finalize_encoding {
2182     my $c = shift;
2183     my $res = $c->res || return;
2184
2185     # Warn if the set charset is different from the one you put into encoding.  We need
2186     # to do this early since encodable_response is false for this condition and we need
2187     # to match the debug output for backcompat (there's a test for this...) -JNAP
2188     if(
2189       $res->content_type_charset and $c->encoding and 
2190       (uc($c->encoding->mime_name) ne uc($res->content_type_charset))
2191     ) {
2192         my $ct = lc($res->content_type_charset);
2193         $c->log->debug("Catalyst encoding config is set to encode in '" .
2194             $c->encoding->mime_name .
2195             "', content type is '$ct', not encoding ");
2196     }
2197
2198     if(
2199       ($res->encodable_response) and
2200       (defined($res->body)) and
2201       (ref(\$res->body) eq 'SCALAR')
2202     ) {
2203         $c->res->body( $c->encoding->encode( $c->res->body, $c->_encode_check ) );
2204
2205         # Set the charset if necessary.  This might be a bit bonkers since encodable response
2206         # is false when the set charset is not the same as the encoding mimetype (maybe 
2207         # confusing action at a distance here..
2208         # Don't try to set the charset if one already exists
2209         $c->res->content_type($c->res->content_type . "; charset=" . $c->encoding->mime_name)
2210           unless($c->res->content_type_charset);
2211     }
2212 }
2213
2214 =head2 $c->finalize_output
2215
2216 An alias for finalize_body.
2217
2218 =head2 $c->finalize_read
2219
2220 Finalizes the input after reading is complete.
2221
2222 =cut
2223
2224 sub finalize_read { my $c = shift; $c->engine->finalize_read( $c, @_ ) }
2225
2226 =head2 $c->finalize_uploads
2227
2228 Finalizes uploads. Cleans up any temporary files.
2229
2230 =cut
2231
2232 sub finalize_uploads { my $c = shift; $c->engine->finalize_uploads( $c, @_ ) }
2233
2234 =head2 $c->get_action( $action, $namespace )
2235
2236 Gets an action in a given namespace.
2237
2238 =cut
2239
2240 sub get_action { my $c = shift; $c->dispatcher->get_action(@_) }
2241
2242 =head2 $c->get_actions( $action, $namespace )
2243
2244 Gets all actions of a given name in a namespace and all parent
2245 namespaces.
2246
2247 =cut
2248
2249 sub get_actions { my $c = shift; $c->dispatcher->get_actions( $c, @_ ) }
2250
2251 =head2 $app->handle_request( @arguments )
2252
2253 Called to handle each HTTP request.
2254
2255 =cut
2256
2257 sub handle_request {
2258     my ( $class, @arguments ) = @_;
2259
2260     # Always expect worst case!
2261     my $status = -1;
2262     try {
2263         if ($class->debug) {
2264             my $secs = time - $START || 1;
2265             my $av = sprintf '%.3f', $COUNT / $secs;
2266             my $time = localtime time;
2267             $class->log->info("*** Request $COUNT ($av/s) [$$] [$time] ***");
2268         }
2269
2270         my $c = $class->prepare(@arguments);
2271         $c->dispatch;
2272         $status = $c->finalize;
2273     } catch {
2274         #rethow if this can be handled by middleware
2275         if ( $class->_handle_http_exception($_) ) {
2276             $_->can('rethrow') ? $_->rethrow : croak $_;
2277         }
2278         chomp(my $error = $_);
2279         $class->log->error(qq/Caught exception in engine "$error"/);
2280     };
2281
2282     $COUNT++;
2283
2284     if(my $coderef = $class->log->can('_flush')){
2285         $class->log->$coderef();
2286     }
2287     return $status;
2288 }
2289
2290 =head2 $class->prepare( @arguments )
2291
2292 Creates a Catalyst context from an engine-specific request (Apache, CGI,
2293 etc.).
2294
2295 =cut
2296
2297 has _uploadtmp => (
2298     is => 'ro',
2299     predicate => '_has_uploadtmp',
2300 );
2301
2302 sub prepare {
2303     my ( $class, @arguments ) = @_;
2304
2305     # XXX
2306     # After the app/ctxt split, this should become an attribute based on something passed
2307     # into the application.
2308     $class->context_class( ref $class || $class ) unless $class->context_class;
2309
2310     my $uploadtmp = $class->config->{uploadtmp};
2311     my $c = $class->context_class->new({ $uploadtmp ? (_uploadtmp => $uploadtmp) : ()});
2312
2313     $c->response->_context($c);
2314
2315     $c->stats($class->stats_class->new)->enable($c->use_stats);
2316
2317     if ( $c->debug || $c->config->{enable_catalyst_header} ) {
2318         $c->res->headers->header( 'X-Catalyst' => $Catalyst::VERSION );
2319     }
2320
2321     try {
2322         # Allow engine to direct the prepare flow (for POE)
2323         if ( my $prepare = $c->engine->can('prepare') ) {
2324             $c->engine->$prepare( $c, @arguments );
2325         }
2326         else {
2327             $c->prepare_request(@arguments);
2328             $c->prepare_connection;
2329             $c->prepare_query_parameters;
2330             $c->prepare_headers; # Just hooks, no longer needed - they just
2331             $c->prepare_cookies; # cause the lazy attribute on req to build
2332             $c->prepare_path;
2333
2334             # Prepare the body for reading, either by prepare_body
2335             # or the user, if they are using $c->read
2336             $c->prepare_read;
2337
2338             # Parse the body unless the user wants it on-demand
2339             unless ( ref($c)->config->{parse_on_demand} ) {
2340                 $c->prepare_body;
2341             }
2342         }
2343         $c->prepare_action;
2344     }
2345     # VERY ugly and probably shouldn't rely on ->finalize actually working
2346     catch {
2347         # failed prepare is always due to an invalid request, right?
2348         $c->response->status(400);
2349         $c->response->content_type('text/plain');
2350         $c->response->body('Bad Request');
2351         # Note we call finalize and then die here, which escapes
2352         # finalize being called in the enclosing block..
2353         # It in fact couldn't be called, as we don't return $c..
2354         # This is a mess - but I'm unsure you can fix this without
2355         # breaking compat for people doing crazy things (we should set
2356         # the 400 and just return the ctx here IMO, letting finalize get called
2357         # above...
2358         $c->finalize;
2359         die $_;
2360     };
2361
2362     $c->log_request;
2363
2364     return $c;
2365 }
2366
2367 =head2 $c->prepare_action
2368
2369 Prepares action. See L<Catalyst::Dispatcher>.
2370
2371 =cut
2372
2373 sub prepare_action {
2374     my $c = shift;
2375     my $ret = $c->dispatcher->prepare_action( $c, @_);
2376
2377     if($c->encoding) {
2378         foreach (@{$c->req->arguments}, @{$c->req->captures}) {
2379           $_ = $c->_handle_param_unicode_decoding($_);
2380         }
2381     }
2382
2383     return $ret;
2384 }
2385
2386
2387 =head2 $c->prepare_body
2388
2389 Prepares message body.
2390
2391 =cut
2392
2393 sub prepare_body {
2394     my $c = shift;
2395
2396     return if $c->request->_has_body;
2397
2398     # Initialize on-demand data
2399     $c->engine->prepare_body( $c, @_ );
2400     $c->prepare_parameters;
2401     $c->prepare_uploads;
2402 }
2403
2404 =head2 $c->prepare_body_chunk( $chunk )
2405
2406 Prepares a chunk of data before sending it to L<HTTP::Body>.
2407
2408 See L<Catalyst::Engine>.
2409
2410 =cut
2411
2412 sub prepare_body_chunk {
2413     my $c = shift;
2414     $c->engine->prepare_body_chunk( $c, @_ );
2415 }
2416
2417 =head2 $c->prepare_body_parameters
2418
2419 Prepares body parameters.
2420
2421 =cut
2422
2423 sub prepare_body_parameters {
2424     my $c = shift;
2425     $c->request->prepare_body_parameters( $c, @_ );
2426 }
2427
2428 =head2 $c->prepare_connection
2429
2430 Prepares connection.
2431
2432 =cut
2433
2434 sub prepare_connection {
2435     my $c = shift;
2436     $c->request->prepare_connection($c);
2437 }
2438
2439 =head2 $c->prepare_cookies
2440
2441 Prepares cookies by ensuring that the attribute on the request
2442 object has been built.
2443
2444 =cut
2445
2446 sub prepare_cookies { my $c = shift; $c->request->cookies }
2447
2448 =head2 $c->prepare_headers
2449
2450 Prepares request headers by ensuring that the attribute on the request
2451 object has been built.
2452
2453 =cut
2454
2455 sub prepare_headers { my $c = shift; $c->request->headers }
2456
2457 =head2 $c->prepare_parameters
2458
2459 Prepares parameters.
2460
2461 =cut
2462
2463 sub prepare_parameters {
2464     my $c = shift;
2465     $c->prepare_body_parameters;
2466     $c->engine->prepare_parameters( $c, @_ );
2467 }
2468
2469 =head2 $c->prepare_path
2470
2471 Prepares path and base.
2472
2473 =cut
2474
2475 sub prepare_path { my $c = shift; $c->engine->prepare_path( $c, @_ ) }
2476
2477 =head2 $c->prepare_query_parameters
2478
2479 Prepares query parameters.
2480
2481 =cut
2482
2483 sub prepare_query_parameters {
2484     my $c = shift;
2485
2486     $c->engine->prepare_query_parameters( $c, @_ );
2487 }
2488
2489 =head2 $c->log_request
2490
2491 Writes information about the request to the debug logs.  This includes:
2492
2493 =over 4
2494
2495 =item * Request method, path, and remote IP address
2496
2497 =item * Query keywords (see L<Catalyst::Request/query_keywords>)
2498
2499 =item * Request parameters
2500
2501 =item * File uploads
2502
2503 =back
2504
2505 =cut
2506
2507 sub log_request {
2508     my $c = shift;
2509
2510     return unless $c->debug;
2511
2512     my($dump) = grep {$_->[0] eq 'Request' } $c->dump_these;
2513     my $request = $dump->[1];
2514
2515     my ( $method, $path, $address ) = ( $request->method, $request->path, $request->address );
2516     $method ||= '';
2517     $path = '/' unless length $path;
2518     $address ||= '';
2519
2520     $path =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
2521     $path = decode_utf8($path);
2522
2523     $c->log->debug(qq/"$method" request for "$path" from "$address"/);
2524
2525     $c->log_request_headers($request->headers);
2526
2527     if ( my $keywords = $request->query_keywords ) {
2528         $c->log->debug("Query keywords are: $keywords");
2529     }
2530
2531     $c->log_request_parameters( query => $request->query_parameters, $request->_has_body ? (body => $request->body_parameters) : () );
2532
2533     $c->log_request_uploads($request);
2534 }
2535
2536 =head2 $c->log_response
2537
2538 Writes information about the response to the debug logs by calling
2539 C<< $c->log_response_status_line >> and C<< $c->log_response_headers >>.
2540
2541 =cut
2542
2543 sub log_response {
2544     my $c = shift;
2545
2546     return unless $c->debug;
2547
2548     my($dump) = grep {$_->[0] eq 'Response' } $c->dump_these;
2549     my $response = $dump->[1];
2550
2551     $c->log_response_status_line($response);
2552     $c->log_response_headers($response->headers);
2553 }
2554
2555 =head2 $c->log_response_status_line($response)
2556
2557 Writes one line of information about the response to the debug logs.  This includes:
2558
2559 =over 4
2560
2561 =item * Response status code
2562
2563 =item * Content-Type header (if present)
2564
2565 =item * Content-Length header (if present)
2566
2567 =back
2568
2569 =cut
2570
2571 sub log_response_status_line {
2572     my ($c, $response) = @_;
2573
2574     $c->log->debug(
2575         sprintf(
2576             'Response Code: %s; Content-Type: %s; Content-Length: %s',
2577             $response->status                            || 'unknown',
2578             $response->headers->header('Content-Type')   || 'unknown',
2579             $response->headers->header('Content-Length') || 'unknown'
2580         )
2581     );
2582 }
2583
2584 =head2 $c->log_response_headers($headers);
2585
2586 Hook method which can be wrapped by plugins to log the response headers.
2587 No-op in the default implementation.
2588
2589 =cut
2590
2591 sub log_response_headers {}
2592
2593 =head2 $c->log_request_parameters( query => {}, body => {} )
2594
2595 Logs request parameters to debug logs
2596
2597 =cut
2598
2599 sub log_request_parameters {
2600     my $c          = shift;
2601     my %all_params = @_;
2602
2603     return unless $c->debug;
2604
2605     my $column_width = Catalyst::Utils::term_width() - 44;
2606     foreach my $type (qw(query body)) {
2607         my $params = $all_params{$type};
2608         next if ! keys %$params;
2609         my $t = Text::SimpleTable->new( [ 35, 'Parameter' ], [ $column_width, 'Value' ] );
2610         for my $key ( sort keys %$params ) {
2611             my $param = $params->{$key};
2612             my $value = defined($param) ? $param : '';
2613             $t->row( $key, ref $value eq 'ARRAY' ? ( join ', ', @$value ) : $value );
2614         }
2615         $c->log->debug( ucfirst($type) . " Parameters are:\n" . $t->draw );
2616     }
2617 }
2618
2619 =head2 $c->log_request_uploads
2620
2621 Logs file uploads included in the request to the debug logs.
2622 The parameter name, filename, file type, and file size are all included in
2623 the debug logs.
2624
2625 =cut
2626
2627 sub log_request_uploads {
2628     my $c = shift;
2629     my $request = shift;
2630     return unless $c->debug;
2631     my $uploads = $request->uploads;
2632     if ( keys %$uploads ) {
2633         my $t = Text::SimpleTable->new(
2634             [ 12, 'Parameter' ],
2635             [ 26, 'Filename' ],
2636             [ 18, 'Type' ],
2637             [ 9,  'Size' ]
2638         );
2639         for my $key ( sort keys %$uploads ) {
2640             my $upload = $uploads->{$key};
2641             for my $u ( ref $upload eq 'ARRAY' ? @{$upload} : ($upload) ) {
2642                 $t->row( $key, $u->filename, $u->type, $u->size );
2643             }
2644         }
2645         $c->log->debug( "File Uploads are:\n" . $t->draw );
2646     }
2647 }
2648
2649 =head2 $c->log_request_headers($headers);
2650
2651 Hook method which can be wrapped by plugins to log the request headers.
2652 No-op in the default implementation.
2653
2654 =cut
2655
2656 sub log_request_headers {}
2657
2658 =head2 $c->log_headers($type => $headers)
2659
2660 Logs L<HTTP::Headers> (either request or response) to the debug logs.
2661
2662 =cut
2663
2664 sub log_headers {
2665     my $c       = shift;
2666     my $type    = shift;
2667     my $headers = shift;    # an HTTP::Headers instance
2668
2669     return unless $c->debug;
2670
2671     my $column_width = Catalyst::Utils::term_width() - 28;
2672     my $t = Text::SimpleTable->new( [ 15, 'Header Name' ], [ $column_width, 'Value' ] );
2673     $headers->scan(
2674         sub {
2675             my ( $name, $value ) = @_;
2676             $t->row( $name, $value );
2677         }
2678     );
2679     $c->log->debug( ucfirst($type) . " Headers:\n" . $t->draw );
2680 }
2681
2682
2683 =head2 $c->prepare_read
2684
2685 Prepares the input for reading.
2686
2687 =cut
2688
2689 sub prepare_read { my $c = shift; $c->engine->prepare_read( $c, @_ ) }
2690
2691 =head2 $c->prepare_request
2692
2693 Prepares the engine request.
2694
2695 =cut
2696
2697 sub prepare_request { my $c = shift; $c->engine->prepare_request( $c, @_ ) }
2698
2699 =head2 $c->prepare_uploads
2700
2701 Prepares uploads.
2702
2703 =cut
2704
2705 sub prepare_uploads {
2706     my $c = shift;
2707     $c->engine->prepare_uploads( $c, @_ );
2708 }
2709
2710 =head2 $c->prepare_write
2711
2712 Prepares the output for writing.
2713
2714 =cut
2715
2716 sub prepare_write { my $c = shift; $c->engine->prepare_write( $c, @_ ) }
2717
2718 =head2 $c->request_class
2719
2720 Returns or sets the request class. Defaults to L<Catalyst::Request>.
2721
2722 =head2 $app->request_class_traits
2723
2724 An arrayref of L<Moose::Role>s which are applied to the request class.  
2725
2726 =head2 $app->composed_request_class
2727
2728 This is the request class which has been composed with any request_class_traits.
2729
2730 =head2 $c->response_class
2731
2732 Returns or sets the response class. Defaults to L<Catalyst::Response>.
2733
2734 =head2 $app->response_class_traits
2735
2736 An arrayref of L<Moose::Role>s which are applied to the response class.
2737
2738 =head2 $app->composed_response_class
2739
2740 This is the request class which has been composed with any response_class_traits.
2741
2742 =head2 $c->read( [$maxlength] )
2743
2744 Reads a chunk of data from the request body. This method is designed to
2745 be used in a while loop, reading C<$maxlength> bytes on every call.
2746 C<$maxlength> defaults to the size of the request if not specified.
2747
2748 You have to set C<< MyApp->config(parse_on_demand => 1) >> to use this
2749 directly.
2750
2751 Warning: If you use read(), Catalyst will not process the body,
2752 so you will not be able to access POST parameters or file uploads via
2753 $c->request.  You must handle all body parsing yourself.
2754
2755 =cut
2756
2757 sub read { my $c = shift; return $c->request->read( @_ ) }
2758
2759 =head2 $c->run
2760
2761 Starts the engine.
2762
2763 =cut
2764
2765 sub run {
2766   my $app = shift;
2767   $app->_make_immutable_if_needed;
2768   $app->engine_loader->needs_psgi_engine_compat_hack ?
2769     $app->engine->run($app, @_) :
2770       $app->engine->run( $app, $app->_finalized_psgi_app, @_ );
2771 }
2772
2773 sub _make_immutable_if_needed {
2774     my $class = shift;
2775     my $meta = find_meta($class);
2776     my $isa_ca = $class->isa('Class::Accessor::Fast') || $class->isa('Class::Accessor');
2777     if (
2778         $meta->is_immutable
2779         && ! { $meta->immutable_options }->{replace_constructor}
2780         && $isa_ca
2781     ) {
2782         warn("You made your application class ($class) immutable, "
2783             . "but did not inline the\nconstructor. "
2784             . "This will break catalyst, as your app \@ISA "
2785             . "Class::Accessor(::Fast)?\nPlease pass "
2786             . "(replace_constructor => 1)\nwhen making your class immutable.\n");
2787     }
2788     unless ($meta->is_immutable) {
2789         # XXX - FIXME warning here as you should make your app immutable yourself.
2790         $meta->make_immutable(
2791             replace_constructor => 1,
2792         );
2793     }
2794 }
2795
2796 =head2 $c->set_action( $action, $code, $namespace, $attrs )
2797
2798 Sets an action in a given namespace.
2799
2800 =cut
2801
2802 sub set_action { my $c = shift; $c->dispatcher->set_action( $c, @_ ) }
2803
2804 =head2 $c->setup_actions($component)
2805
2806 Sets up actions for a component.
2807
2808 =cut
2809
2810 sub setup_actions { my $c = shift; $c->dispatcher->setup_actions( $c, @_ ) }
2811
2812 =head2 $c->setup_components
2813
2814 This method is called internally to set up the application's components.
2815
2816 It finds modules by calling the L<locate_components> method, expands them to
2817 package names with the L<expand_component_module> method, and then installs
2818 each component into the application.
2819
2820 The C<setup_components> config option is passed to both of the above methods.
2821
2822 Installation of each component is performed by the L<setup_component> method,
2823 below.
2824
2825 =cut
2826
2827 sub setup_components {
2828     my $class = shift;
2829
2830     my $config  = $class->config->{ setup_components };
2831
2832     my @comps = $class->locate_components($config);
2833     my %comps = map { $_ => 1 } @comps;
2834
2835     my $deprecatedcatalyst_component_names = grep { /::[CMV]::/ } @comps;
2836     $class->log->warn(qq{Your application is using the deprecated ::[MVC]:: type naming scheme.\n}.
2837         qq{Please switch your class names to ::Model::, ::View:: and ::Controller: as appropriate.\n}
2838     ) if $deprecatedcatalyst_component_names;
2839
2840     for my $component ( @comps ) {
2841
2842         # We pass ignore_loaded here so that overlay files for (e.g.)
2843         # Model::DBI::Schema sub-classes are loaded - if it's in @comps
2844         # we know M::P::O found a file on disk so this is safe
2845
2846         Catalyst::Utils::ensure_class_loaded( $component, { ignore_loaded => 1 } );
2847     }
2848
2849     for my $component (@comps) {
2850         my $instance = $class->components->{ $component } = $class->delayed_setup_component($component);
2851     }
2852
2853     # Inject a component or wrap a stand alone class in an adaptor. This makes a list
2854     # of named components in the configuration that are not actually existing (not a
2855     # real file).
2856
2857     $class->setup_injected_components;
2858
2859     # All components are registered, now we need to 'init' them.
2860     foreach my $component_name (keys %{$class->components||+{}}) {
2861       $class->components->{$component_name} = $class->components->{$component_name}->() if
2862         (ref($class->components->{$component_name}) || '') eq 'CODE';
2863     }
2864 }
2865
2866 =head2 $app->setup_injected_components
2867
2868 Called by setup_compoents to setup components that are injected.
2869
2870 =cut
2871
2872 sub setup_injected_components {
2873     my ($class) = @_;
2874     my @injected_components = keys %{$class->config->{inject_components} ||+{}};
2875
2876     foreach my $injected_comp_name(@injected_components) {
2877         $class->setup_injected_component(
2878           $injected_comp_name,
2879           $class->config->{inject_components}->{$injected_comp_name});
2880     }
2881 }
2882
2883 =head2 $app->setup_injected_component( $injected_component_name, $config )
2884
2885 Setup a given injected component.
2886
2887 =cut
2888
2889 sub setup_injected_component {
2890     my ($class, $injected_comp_name, $config) = @_;
2891     if(my $component_class = $config->{from_component}) {
2892         my @roles = @{$config->{roles} ||[]};
2893         Catalyst::Utils::inject_component(
2894           into => $class,
2895           component => $component_class,
2896           (scalar(@roles) ? (traits => \@roles) : ()),
2897           as => $injected_comp_name);
2898     }
2899 }
2900
2901 =head2 $app->inject_component($MyApp_Component_name => \%args);
2902
2903 Add a component that is injected at setup:
2904
2905     MyApp->inject_component( 'Model::Foo' => { from_component => 'Common::Foo' } );
2906
2907 Must be called before ->setup.  Expects a component name for your
2908 current application and \%args where
2909
2910 =over 4
2911
2912 =item from_component
2913
2914 The target component being injected into your application
2915
2916 =item roles
2917
2918 An arrayref of L<Moose::Role>s that are applied to your component.
2919
2920 =back
2921
2922 Example
2923
2924     MyApp->inject_component(
2925       'Model::Foo' => {
2926         from_component => 'Common::Model::Foo',
2927         roles => ['Role1', 'Role2'],
2928       });
2929
2930 =head2 $app->inject_components
2931
2932 Inject a list of components:
2933
2934     MyApp->inject_components(
2935       'Model::FooOne' => {
2936         from_component => 'Common::Model::Foo',
2937         roles => ['Role1', 'Role2'],
2938       },
2939       'Model::FooTwo' => {
2940         from_component => 'Common::Model::Foo',
2941         roles => ['Role1', 'Role2'],
2942       });
2943
2944 =cut
2945
2946 sub inject_component {
2947   my ($app, $name, $args) = @_;
2948   die "Component $name exists" if
2949     $app->config->{inject_components}->{$name};
2950   $app->config->{inject_components}->{$name} = $args;
2951 }
2952
2953 sub inject_components {
2954   my $app = shift;
2955   while(@_) {
2956     $app->inject_component(shift, shift);
2957   }
2958 }
2959
2960 =head2 $c->locate_components( $setup_component_config )
2961
2962 This method is meant to provide a list of component modules that should be
2963 setup for the application.  By default, it will use L<Module::Pluggable>.
2964
2965 Specify a C<setup_components> config option to pass additional options directly
2966 to L<Module::Pluggable>. To add additional search paths, specify a key named
2967 C<search_extra> as an array reference. Items in the array beginning with C<::>
2968 will have the application class name prepended to them.
2969
2970 =cut
2971
2972 sub locate_components {
2973     my $class  = shift;
2974     my $config = shift;
2975
2976     my @paths   = qw( ::M ::Model ::V ::View ::C ::Controller );
2977     my $extra   = delete $config->{ search_extra } || [];
2978
2979     unshift @paths, @$extra;
2980
2981     my @comps = map { sort { length($a) <=> length($b) } Module::Pluggable::Object->new(
2982       search_path => [ map { s/^(?=::)/$class/; $_; } ($_) ],
2983       %$config
2984     )->plugins } @paths;
2985
2986     return @comps;
2987 }
2988
2989 =head2 $c->expand_component_module( $component, $setup_component_config )
2990
2991 Components found by C<locate_components> will be passed to this method, which
2992 is expected to return a list of component (package) names to be set up.
2993
2994 =cut
2995
2996 sub expand_component_module {
2997     my ($class, $module) = @_;
2998     return Devel::InnerPackage::list_packages( $module );
2999 }
3000
3001 =head2 $app->delayed_setup_component
3002
3003 Returns a coderef that points to a setup_component instance.  Used
3004 internally for when you want to delay setup until the first time
3005 the component is called.
3006
3007 =cut
3008
3009 sub delayed_setup_component {
3010   my($class, $component, @more) = @_;
3011   return sub {
3012     return my $instance = $class->setup_component($component, @more);
3013   };
3014 }
3015
3016 =head2 $c->setup_component
3017
3018 =cut
3019
3020 sub setup_component {
3021     my( $class, $component ) = @_;
3022
3023     unless ( $component->can( 'COMPONENT' ) ) {
3024         return $component;
3025     }
3026
3027     my $config = $class->config_for($component);
3028     # Stash catalyst_component_name in the config here, so that custom COMPONENT
3029     # methods also pass it. local to avoid pointlessly shitting in config
3030     # for the debug screen, as $component is already the key name.
3031     local $config->{catalyst_component_name} = $component;
3032
3033     my $instance = eval {
3034       $component->COMPONENT( $class, $config );
3035     } || do {
3036       my $error = $@;
3037       chomp $error;
3038       Catalyst::Exception->throw(
3039         message => qq/Couldn't instantiate component "$component", "$error"/
3040       );
3041     };
3042
3043     unless (blessed $instance) {
3044         my $metaclass = Moose::Util::find_meta($component);
3045         my $method_meta = $metaclass->find_method_by_name('COMPONENT');
3046         my $component_method_from = $method_meta->associated_metaclass->name;
3047         my $value = defined($instance) ? $instance : 'undef';
3048         Catalyst::Exception->throw(
3049             message =>
3050             qq/Couldn't instantiate component "$component", COMPONENT() method (from $component_method_from) didn't return an object-like value (value was $value)./
3051         );
3052     }
3053
3054     my @expanded_components = $instance->can('expand_modules')
3055       ? $instance->expand_modules( $component, $config )
3056       : $class->expand_component_module( $component, $config );
3057     for my $component (@expanded_components) {
3058       next if $class->components->{ $component };
3059       $class->components->{ $component } = $class->setup_component($component);
3060     }
3061
3062     return $instance; 
3063 }
3064
3065 =head2 $app->config_for( $component_name )
3066
3067 Return the application level configuration (which is not yet merged with any
3068 local component configuration, via $component_class->config) for the named
3069 component or component object. Example:
3070
3071     MyApp->config(
3072       'Model::Foo' => { a => 1, b => 2},
3073     );
3074
3075     my $config = MyApp->config_for('MyApp::Model::Foo');
3076
3077 In this case $config is the hashref C< {a=>1, b=>2} >.
3078
3079 This is also handy for looking up configuration for a plugin, to make sure you follow
3080 existing L<Catalyst> standards for where a plugin should put its configuration.
3081
3082 =cut
3083
3084 sub config_for {
3085     my ($class, $component_name) = @_;
3086     my $component_suffix = Catalyst::Utils::class2classsuffix($component_name);
3087     my $config = $class->config->{ $component_suffix } || {};
3088
3089     return $config;
3090 }
3091
3092 =head2 $c->setup_dispatcher
3093
3094 Sets up dispatcher.
3095
3096 =cut
3097
3098 sub setup_dispatcher {
3099     my ( $class, $dispatcher ) = @_;
3100
3101     if ($dispatcher) {
3102         $dispatcher = 'Catalyst::Dispatcher::' . $dispatcher;
3103     }
3104
3105     if ( my $env = Catalyst::Utils::env_value( $class, 'DISPATCHER' ) ) {
3106         $dispatcher = 'Catalyst::Dispatcher::' . $env;
3107     }
3108
3109     unless ($dispatcher) {
3110         $dispatcher = $class->dispatcher_class;
3111     }
3112
3113     load_class($dispatcher);
3114
3115     # dispatcher instance
3116     $class->dispatcher( $dispatcher->new );
3117 }
3118
3119 =head2 $c->setup_engine
3120
3121 Sets up engine.
3122
3123 =cut
3124
3125 sub engine_class {
3126     my ($class, $requested_engine) = @_;
3127
3128     if (!$class->engine_loader || $requested_engine) {
3129         $class->engine_loader(
3130             Catalyst::EngineLoader->new({
3131                 application_name => $class,
3132                 (defined $requested_engine
3133                      ? (catalyst_engine_class => $requested_engine) : ()),
3134             }),
3135         );
3136     }
3137
3138     $class->engine_loader->catalyst_engine_class;
3139 }
3140
3141 sub setup_engine {
3142     my ($class, $requested_engine) = @_;
3143
3144     my $engine = do {
3145         my $loader = $class->engine_loader;
3146
3147         if (!$loader || $requested_engine) {
3148             $loader = Catalyst::EngineLoader->new({
3149                 application_name => $class,
3150                 (defined $requested_engine
3151                      ? (requested_engine => $requested_engine) : ()),
3152             }),
3153
3154             $class->engine_loader($loader);
3155         }
3156
3157         $loader->catalyst_engine_class;
3158     };
3159
3160     # Don't really setup_engine -- see _setup_psgi_app for explanation.
3161     return if $class->loading_psgi_file;
3162
3163     load_class($engine);
3164
3165     if ($ENV{MOD_PERL}) {
3166         my $apache = $class->engine_loader->auto;
3167
3168         my $meta = find_meta($class);
3169         my $was_immutable = $meta->is_immutable;
3170         my %immutable_options = $meta->immutable_options;
3171         $meta->make_mutable if $was_immutable;
3172
3173         $meta->add_method(handler => sub {
3174             my $r = shift;
3175             my $psgi_app = $class->_finalized_psgi_app;
3176             $apache->call_app($r, $psgi_app);
3177         });
3178
3179         $meta->make_immutable(%immutable_options) if $was_immutable;
3180     }
3181
3182     $class->engine( $engine->new );
3183
3184     return;
3185 }
3186
3187 ## This exists just to supply a prebuild psgi app for mod_perl and for the 
3188 ## build in server support (back compat support for pre psgi port behavior).
3189 ## This is so that we don't build a new psgi app for each request when using
3190 ## the mod_perl handler or the built in servers (http and fcgi, etc).
3191
3192 sub _finalized_psgi_app {
3193     my ($app) = @_;
3194
3195     unless ($app->_psgi_app) {
3196         my $psgi_app = $app->_setup_psgi_app;
3197         $app->_psgi_app($psgi_app);
3198     }
3199
3200     return $app->_psgi_app;
3201 }
3202
3203 ## Look for a psgi file like 'myapp_web.psgi' (if the app is MyApp::Web) in the
3204 ## home directory and load that and return it (just assume it is doing the 
3205 ## right thing :) ).  If that does not exist, call $app->psgi_app, wrap that
3206 ## in default_middleware and return it ( this is for backward compatibility
3207 ## with pre psgi port behavior ).
3208
3209 sub _setup_psgi_app {
3210     my ($app) = @_;
3211
3212     for my $home (Path::Class::Dir->new($app->config->{home})) {
3213         my $psgi_file = $home->file(
3214             Catalyst::Utils::appprefix($app) . '.psgi',
3215         );
3216
3217         next unless -e $psgi_file;
3218
3219         # If $psgi_file calls ->setup_engine, it's doing so to load
3220         # Catalyst::Engine::PSGI. But if it does that, we're only going to
3221         # throw away the loaded PSGI-app and load the 5.9 Catalyst::Engine
3222         # anyway. So set a flag (ick) that tells setup_engine not to populate
3223         # $c->engine or do any other things we might regret.
3224
3225         $app->loading_psgi_file(1);
3226         my $psgi_app = Plack::Util::load_psgi($psgi_file);
3227         $app->loading_psgi_file(0);
3228
3229         return $psgi_app
3230             unless $app->engine_loader->needs_psgi_engine_compat_hack;
3231
3232         warn <<"EOW";
3233 Found a legacy Catalyst::Engine::PSGI .psgi file at ${psgi_file}.
3234
3235 Its content has been ignored. Please consult the Catalyst::Upgrading
3236 documentation on how to upgrade from Catalyst::Engine::PSGI.
3237 EOW
3238     }
3239
3240     return $app->apply_default_middlewares($app->psgi_app);
3241 }
3242
3243 =head2 $c->apply_default_middlewares
3244
3245 Adds the following L<Plack> middlewares to your application, since they are
3246 useful and commonly needed:
3247
3248 L<Plack::Middleware::LighttpdScriptNameFix> (if you are using Lighttpd),
3249 L<Plack::Middleware::IIS6ScriptNameFix> (always applied since this middleware
3250 is smart enough to conditionally apply itself).
3251
3252 We will also automatically add L<Plack::Middleware::ReverseProxy> if we notice
3253 that your HTTP $env variable C<REMOTE_ADDR> is '127.0.0.1'.  This is usually
3254 an indication that your server is running behind a proxy frontend.  However in
3255 2014 this is often not the case.  We preserve this code for backwards compatibility
3256 however I B<highly> recommend that if you are running the server behind a front
3257 end proxy that you clearly indicate so with the C<using_frontend_proxy> configuration
3258 setting to true for your environment configurations that run behind a proxy.  This
3259 way if you change your front end proxy address someday your code would inexplicably
3260 stop working as expected.
3261
3262 Additionally if we detect we are using Nginx, we add a bit of custom middleware
3263 to solve some problems with the way that server handles $ENV{PATH_INFO} and
3264 $ENV{SCRIPT_NAME}.
3265
3266 Please B<NOTE> that if you do use C<using_frontend_proxy> the middleware is now
3267 adding via C<registered_middleware> rather than this method.
3268
3269 If you are using Lighttpd or IIS6 you may wish to apply these middlewares.  In
3270 general this is no longer a common case but we have this here for backward
3271 compatibility.
3272
3273 =cut
3274
3275
3276 sub apply_default_middlewares {
3277     my ($app, $psgi_app) = @_;
3278
3279     # Don't add this conditional IF we are explicitly saying we want the
3280     # frontend proxy support.  We don't need it here since if that is the
3281     # case it will be always loaded in the default_middleware.
3282
3283     unless($app->config->{using_frontend_proxy}) {
3284       $psgi_app = Plack::Middleware::Conditional->wrap(
3285           $psgi_app,
3286           builder   => sub { Plack::Middleware::ReverseProxy->wrap($_[0]) },
3287           condition => sub {
3288               my ($env) = @_;
3289               return if $app->config->{ignore_frontend_proxy};
3290               return $env->{REMOTE_ADDR} eq '127.0.0.1';
3291           },
3292       );
3293     }
3294
3295     # If we're running under Lighttpd, swap PATH_INFO and SCRIPT_NAME
3296     # http://lists.scsys.co.uk/pipermail/catalyst/2006-June/008361.html
3297     $psgi_app = Plack::Middleware::Conditional->wrap(
3298         $psgi_app,
3299         builder   => sub { Plack::Middleware::LighttpdScriptNameFix->wrap($_[0]) },
3300         condition => sub {
3301             my ($env) = @_;
3302             return unless $env->{SERVER_SOFTWARE} && $env->{SERVER_SOFTWARE} =~ m!lighttpd[-/]1\.(\d+\.\d+)!;
3303             return unless $1 < 4.23;
3304             1;
3305         },
3306     );
3307
3308     # we're applying this unconditionally as the middleware itself already makes
3309     # sure it doesn't fuck things up if it's not running under one of the right
3310     # IIS versions
3311     $psgi_app = Plack::Middleware::IIS6ScriptNameFix->wrap($psgi_app);
3312
3313     # And another IIS issue, this time with IIS7.
3314     $psgi_app = Plack::Middleware::Conditional->wrap(
3315         $psgi_app,
3316         builder => sub { Plack::Middleware::IIS7KeepAliveFix->wrap($_[0]) },
3317         condition => sub {
3318             my ($env) = @_;
3319             return $env->{SERVER_SOFTWARE} && $env->{SERVER_SOFTWARE} =~ m!IIS/7\.[0-9]!;
3320         },
3321     );
3322
3323     return $psgi_app;
3324 }
3325
3326 =head2 App->psgi_app
3327
3328 =head2 App->to_app
3329
3330 Returns a PSGI application code reference for the catalyst application
3331 C<$c>. This is the bare application created without the C<apply_default_middlewares>
3332 method called.  We do however apply C<registered_middleware> since those are
3333 integral to how L<Catalyst> functions.  Also, unlike starting your application
3334 with a generated server script (via L<Catalyst::Devel> and C<catalyst.pl>) we do
3335 not attempt to return a valid L<PSGI> application using any existing C<${myapp}.psgi>
3336 scripts in your $HOME directory.
3337
3338 B<NOTE> C<apply_default_middlewares> was originally created when the first PSGI
3339 port was done for v5.90000.  These are middlewares that are added to achieve
3340 backward compatibility with older applications.  If you start your application
3341 using one of the supplied server scripts (generated with L<Catalyst::Devel> and
3342 the project skeleton script C<catalyst.pl>) we apply C<apply_default_middlewares>
3343 automatically.  This was done so that pre and post PSGI port applications would
3344 work the same way.
3345
3346 This is what you want to be using to retrieve the PSGI application code
3347 reference of your Catalyst application for use in a custom F<.psgi> or in your
3348 own created server modules.
3349
3350 =cut
3351
3352 *to_app = \&psgi_app;
3353
3354 sub psgi_app {
3355     my ($app) = @_;
3356     my $psgi = $app->engine->build_psgi_app($app);
3357     return $app->Catalyst::Utils::apply_registered_middleware($psgi);
3358 }
3359
3360 =head2 $c->setup_home
3361
3362 Sets up the home directory.
3363
3364 =cut
3365
3366 sub setup_home {
3367     my ( $class, $home ) = @_;
3368
3369     if ( my $env = Catalyst::Utils::env_value( $class, 'HOME' ) ) {
3370         $home = $env;
3371     }
3372
3373     $home ||= Catalyst::Utils::home($class);
3374
3375     if ($home) {
3376         #I remember recently being scolded for assigning config values like this
3377         $class->config->{home} ||= $home;
3378         $class->config->{root} ||= Path::Class::Dir->new($home)->subdir('root');
3379     }
3380 }
3381
3382 =head2 $c->setup_encoding
3383
3384 Sets up the input/output encoding. See L<ENCODING>
3385
3386 =cut
3387
3388 sub setup_encoding {
3389     my $c = shift;
3390     if( exists($c->config->{encoding}) && !defined($c->config->{encoding}) ) {
3391         # Ok, so the user has explicitly said "I don't want encoding..."
3392         return;
3393     } else {
3394       my $enc = defined($c->config->{encoding}) ?
3395         delete $c->config->{encoding} : 'UTF-8'; # not sure why we delete it... (JNAP)
3396       $c->encoding($enc);
3397     }
3398 }
3399
3400 =head2 handle_unicode_encoding_exception
3401
3402 Hook to let you customize how encoding errors are handled.  By default
3403 we just throw an exception.  Receives a hashref of debug information.
3404 Example:
3405
3406     $c->handle_unicode_encoding_exception({
3407         param_value => $value,
3408         error_msg => $_,
3409             encoding_step => 'params',
3410         });
3411
3412 =cut
3413
3414 sub handle_unicode_encoding_exception {
3415     my ( $self, $exception_ctx ) = @_;
3416     die $exception_ctx->{error_msg};
3417 }
3418
3419 # Some unicode helpers cargo culted from the old plugin.  These could likely
3420 # be neater.
3421
3422 sub _handle_unicode_decoding {
3423     my ( $self, $value ) = @_;
3424
3425     return unless defined $value;
3426
3427     ## I think this mess is to support the old nested
3428     if ( ref $value eq 'ARRAY' ) {
3429         foreach ( @$value ) {
3430             $_ = $self->_handle_unicode_decoding($_);
3431         }
3432         return $value;
3433     }
3434     elsif ( ref $value eq 'HASH' ) {
3435         foreach (keys %$value) {
3436             my $encoded_key = $self->_handle_param_unicode_decoding($_);
3437             $value->{$encoded_key} = $self->_handle_unicode_decoding($value->{$_});
3438
3439             # If the key was encoded we now have two (the original and current so
3440             # delete the original.
3441             delete $value->{$_} if $_ ne $encoded_key;
3442         }
3443         return $value;
3444     }
3445     else {
3446         return $self->_handle_param_unicode_decoding($value);
3447     }
3448 }
3449
3450 sub _handle_param_unicode_decoding {
3451     my ( $self, $value ) = @_;
3452     return unless defined $value; # not in love with just ignoring undefs - jnap
3453     return $value if blessed($value); #don't decode when the value is an object.
3454
3455     my $enc = $self->encoding;
3456     return try {
3457       $enc->decode( $value, $self->_encode_check );
3458     }
3459     catch {
3460         $self->handle_unicode_encoding_exception({
3461             param_value => $value,
3462             error_msg => $_,
3463             encoding_step => 'params',
3464         });
3465     };
3466 }
3467
3468 =head2 $c->setup_log
3469
3470 Sets up log by instantiating a L<Catalyst::Log|Catalyst::Log> object and
3471 passing it to C<log()>. Pass in a comma-delimited list of levels to set the
3472 log to.
3473
3474 This method also installs a C<debug> method that returns a true value into the
3475 catalyst subclass if the "debug" level is passed in the comma-delimited list,
3476 or if the C<$CATALYST_DEBUG> environment variable is set to a true value.
3477
3478 Note that if the log has already been setup, by either a previous call to
3479 C<setup_log> or by a call such as C<< __PACKAGE__->log( MyLogger->new ) >>,
3480 that this method won't actually set up the log object.
3481
3482 =cut
3483
3484 sub setup_log {
3485     my ( $class, $levels ) = @_;
3486
3487     $levels ||= '';
3488     $levels =~ s/^\s+//;
3489     $levels =~ s/\s+$//;
3490     my %levels = map { $_ => 1 } split /\s*,\s*/, $levels;
3491
3492     my $env_debug = Catalyst::Utils::env_value( $class, 'DEBUG' );
3493     if ( defined $env_debug ) {
3494         $levels{debug} = 1 if $env_debug; # Ugly!
3495         delete($levels{debug}) unless $env_debug;
3496     }
3497
3498     unless ( $class->log ) {
3499         $class->log( Catalyst::Log->new(keys %levels) );
3500     }
3501
3502     if ( $levels{debug} ) {
3503         Class::MOP::get_metaclass_by_name($class)->add_method('debug' => sub { 1 });
3504         $class->log->debug('Debug messages enabled');
3505     }
3506 }
3507
3508 =head2 $c->setup_plugins
3509
3510 Sets up plugins.
3511
3512 =cut
3513
3514 =head2 $c->setup_stats
3515
3516 Sets up timing statistics class.
3517
3518 =cut
3519
3520 sub setup_stats {
3521     my ( $class, $stats ) = @_;
3522
3523     Catalyst::Utils::ensure_class_loaded($class->stats_class);
3524
3525     my $env = Catalyst::Utils::env_value( $class, 'STATS' );
3526     if ( defined($env) ? $env : ($stats || $class->debug ) ) {
3527         Class::MOP::get_metaclass_by_name($class)->add_method('use_stats' => sub { 1 });
3528         $class->log->debug('Statistics enabled');
3529     }
3530 }
3531
3532
3533 =head2 $c->registered_plugins
3534
3535 Returns a sorted list of the plugins which have either been stated in the
3536 import list.
3537
3538 If passed a given plugin name, it will report a boolean value indicating
3539 whether or not that plugin is loaded.  A fully qualified name is required if
3540 the plugin name does not begin with C<Catalyst::Plugin::>.
3541
3542  if ($c->registered_plugins('Some::Plugin')) {
3543      ...
3544  }
3545
3546 =cut
3547
3548 {
3549
3550     sub registered_plugins {
3551         my $proto = shift;
3552         return sort keys %{ $proto->_plugins } unless @_;
3553         my $plugin = shift;
3554         return 1 if exists $proto->_plugins->{$plugin};
3555         return exists $proto->_plugins->{"Catalyst::Plugin::$plugin"};
3556     }
3557
3558     sub _register_plugin {
3559         my ( $proto, $plugin, $instant ) = @_;
3560         my $class = ref $proto || $proto;
3561
3562         load_class( $plugin );
3563         $class->log->warn( "$plugin inherits from 'Catalyst::Component' - this is deprecated and will not work in 5.81" )
3564             if $plugin->isa( 'Catalyst::Component' );
3565         my $plugin_meta = Moose::Meta::Class->create($plugin);
3566         if (!$plugin_meta->has_method('new')
3567             && ( $plugin->isa('Class::Accessor::Fast') || $plugin->isa('Class::Accessor') ) ) {
3568             $plugin_meta->add_method('new', Moose::Object->meta->get_method('new'))
3569         }
3570         if (!$instant && !$proto->_plugins->{$plugin}) {
3571             my $meta = Class::MOP::get_metaclass_by_name($class);
3572             $meta->superclasses($plugin, $meta->superclasses);
3573         }
3574         $proto->_plugins->{$plugin} = 1;
3575         return $class;
3576     }
3577
3578     sub _default_plugins { return qw() }
3579
3580     sub setup_plugins {
3581         my ( $class, $plugins ) = @_;
3582
3583         $class->_plugins( {} ) unless $class->_plugins;
3584         $plugins = [ grep {
3585             m/Unicode::Encoding/ ? do {
3586                 $class->log->warn(
3587                     'Unicode::Encoding plugin is auto-applied,'
3588                     . ' please remove this from your appclass'
3589                     . ' and make sure to define "encoding" config'
3590                 );
3591                 unless (exists $class->config->{'encoding'}) {
3592                   $class->config->{'encoding'} = 'UTF-8';
3593                 }
3594                 () }
3595                 : $_
3596         } @$plugins ];
3597         push @$plugins, $class->_default_plugins;
3598         $plugins = Data::OptList::mkopt($plugins || []);
3599
3600         my @plugins = map {
3601             [ Catalyst::Utils::resolve_namespace(
3602                   $class . '::Plugin',
3603                   'Catalyst::Plugin', $_->[0]
3604               ),
3605               $_->[1],
3606             ]
3607          } @{ $plugins };
3608
3609         for my $plugin ( reverse @plugins ) {
3610             load_class($plugin->[0], $plugin->[1]);
3611             my $meta = find_meta($plugin->[0]);
3612             next if $meta && $meta->isa('Moose::Meta::Role');
3613
3614             $class->_register_plugin($plugin->[0]);
3615         }
3616
3617         my @roles =
3618             map  { $_->[0]->name, $_->[1] }
3619             grep { blessed($_->[0]) && $_->[0]->isa('Moose::Meta::Role') }
3620             map  { [find_meta($_->[0]), $_->[1]] }
3621             @plugins;
3622
3623         Moose::Util::apply_all_roles(
3624             $class => @roles
3625         ) if @roles;
3626     }
3627 }
3628
3629 =head2 default_middleware
3630
3631 Returns a list of instantiated PSGI middleware objects which is the default
3632 middleware that is active for this application (taking any configuration
3633 options into account, excluding your custom added middleware via the C<psgi_middleware>
3634 configuration option).  You can override this method if you wish to change
3635 the default middleware (although do so at risk since some middleware is vital
3636 to application function.)
3637
3638 The current default middleware list is:
3639
3640       Catalyst::Middleware::Stash
3641       Plack::Middleware::HTTPExceptions
3642       Plack::Middleware::RemoveRedundantBody
3643       Plack::Middleware::FixMissingBodyInRedirect
3644       Plack::Middleware::ContentLength
3645       Plack::Middleware::MethodOverride
3646       Plack::Middleware::Head
3647
3648 If the configuration setting C<using_frontend_proxy> is true we add:
3649
3650       Plack::Middleware::ReverseProxy
3651
3652 If the configuration setting C<using_frontend_proxy_path> is true we add:
3653
3654       Plack::Middleware::ReverseProxyPath
3655
3656 But B<NOTE> that L<Plack::Middleware::ReverseProxyPath> is not a dependency of the
3657 L<Catalyst> distribution so if you want to use this option you should add it to
3658 your project distribution file.
3659
3660 These middlewares will be added at L</setup_middleware> during the
3661 L</setup> phase of application startup.
3662
3663 =cut
3664
3665 sub default_middleware {
3666     my $class = shift;
3667     my @mw = (
3668       Catalyst::Middleware::Stash->new,
3669       Plack::Middleware::HTTPExceptions->new,
3670       Plack::Middleware::RemoveRedundantBody->new,
3671       Plack::Middleware::FixMissingBodyInRedirect->new,
3672       Plack::Middleware::ContentLength->new,
3673       Plack::Middleware::MethodOverride->new,
3674       Plack::Middleware::Head->new);
3675
3676     if($class->config->{using_frontend_proxy}) {
3677         push @mw, Plack::Middleware::ReverseProxy->new;
3678     }
3679
3680     if($class->config->{using_frontend_proxy_path}) {
3681         if(Class::Load::try_load_class('Plack::Middleware::ReverseProxyPath')) {
3682             push @mw, Plack::Middleware::ReverseProxyPath->new;
3683         } else {
3684           $class->log->error("Cannot use configuration 'using_frontend_proxy_path' because 'Plack::Middleware::ReverseProxyPath' is not installed");
3685         }
3686     }
3687
3688     return @mw;
3689 }
3690
3691 =head2 registered_middlewares
3692
3693 Read only accessor that returns an array of all the middleware in the order
3694 that they were added (which is the REVERSE of the order they will be applied).
3695
3696 The values returned will be either instances of L<Plack::Middleware> or of a
3697 compatible interface, or a coderef, which is assumed to be inlined middleware
3698
3699 =head2 setup_middleware (?@middleware)
3700
3701 Read configuration information stored in configuration key C<psgi_middleware> or
3702 from passed @args.
3703
3704 See under L</CONFIGURATION> information regarding C<psgi_middleware> and how
3705 to use it to enable L<Plack::Middleware>
3706
3707 This method is automatically called during 'setup' of your application, so
3708 you really don't need to invoke it.  However you may do so if you find the idea
3709 of loading middleware via configuration weird :).  For example:
3710
3711     package MyApp;
3712
3713     use Catalyst;
3714
3715     __PACKAGE__->setup_middleware('Head');
3716     __PACKAGE__->setup;
3717
3718 When we read middleware definitions from configuration, we reverse the list
3719 which sounds odd but is likely how you expect it to work if you have prior
3720 experience with L<Plack::Builder> or if you previously used the plugin
3721 L<Catalyst::Plugin::EnableMiddleware> (which is now considered deprecated)
3722
3723 So basically your middleware handles an incoming request from the first
3724 registered middleware, down and handles the response from the last middleware
3725 up.
3726
3727 =cut
3728
3729 sub registered_middlewares {
3730     my $class = shift;
3731     if(my $middleware = $class->_psgi_middleware) {
3732         my @mw = ($class->default_middleware, @$middleware);
3733
3734         if($class->config->{using_frontend_proxy}) {
3735           push @mw, Plack::Middleware::ReverseProxy->new;
3736         }
3737
3738         return @mw;
3739     } else {
3740         die "You cannot call ->registered_middlewares until middleware has been setup";
3741     }
3742 }
3743
3744 sub setup_middleware {
3745     my $class = shift;
3746     my @middleware_definitions;
3747
3748     # If someone calls this method you can add middleware with args.  However if its
3749     # called without an arg we need to setup the configuration middleware.
3750     if(@_) {
3751       @middleware_definitions = reverse(@_);
3752     } else {
3753       @middleware_definitions = reverse(@{$class->config->{'psgi_middleware'}||[]})
3754         unless $class->finalized_default_middleware;
3755       $class->finalized_default_middleware(1); # Only do this once, just in case some people call setup over and over...
3756     }
3757
3758     my @middleware = ();
3759     while(my $next = shift(@middleware_definitions)) {
3760         if(ref $next) {
3761             if(Scalar::Util::blessed $next && $next->can('wrap')) {
3762                 push @middleware, $next;
3763             } elsif(ref $next eq 'CODE') {
3764                 push @middleware, $next;
3765             } elsif(ref $next eq 'HASH') {
3766                 my $namespace = shift @middleware_definitions;
3767                 my $mw = $class->Catalyst::Utils::build_middleware($namespace, %$next);
3768                 push @middleware, $mw;
3769             } else {
3770               die "I can't handle middleware definition ${\ref $next}";
3771             }
3772         } else {
3773           my $mw = $class->Catalyst::Utils::build_middleware($next);
3774           push @middleware, $mw;
3775         }
3776     }
3777
3778     my @existing = @{$class->_psgi_middleware || []};
3779     $class->_psgi_middleware([@middleware,@existing,]);
3780 }
3781
3782 =head2 registered_data_handlers
3783
3784 A read only copy of registered Data Handlers returned as a Hash, where each key
3785 is a content type and each value is a subref that attempts to decode that content
3786 type.
3787
3788 =head2 setup_data_handlers (?@data_handler)
3789
3790 Read configuration information stored in configuration key C<data_handlers> or
3791 from passed @args.
3792
3793 See under L</CONFIGURATION> information regarding C<data_handlers>.
3794
3795 This method is automatically called during 'setup' of your application, so
3796 you really don't need to invoke it.
3797
3798 =head2 default_data_handlers
3799
3800 Default Data Handlers that come bundled with L<Catalyst>.  Currently there are
3801 only two default data handlers, for 'application/json' and an alternative to
3802 'application/x-www-form-urlencoded' which supposed nested form parameters via
3803 L<CGI::Struct> or via L<CGI::Struct::XS> IF you've installed it.
3804
3805 The 'application/json' data handler is used to parse incoming JSON into a Perl
3806 data structure.  It used either L<JSON::MaybeXS> or L<JSON>, depending on which
3807 is installed.  This allows you to fail back to L<JSON:PP>, which is a Pure Perl
3808 JSON decoder, and has the smallest dependency impact.
3809
3810 Because we don't wish to add more dependencies to L<Catalyst>, if you wish to
3811 use this new feature we recommend installing L<JSON> or L<JSON::MaybeXS> in
3812 order to get the best performance.  You should add either to your dependency
3813 list (Makefile.PL, dist.ini, cpanfile, etc.)
3814
3815 =cut
3816
3817 sub registered_data_handlers {
3818     my $class = shift;
3819     if(my $data_handlers = $class->_data_handlers) {
3820         return %$data_handlers;
3821     } else {
3822         $class->setup_data_handlers;
3823         return $class->registered_data_handlers;
3824     }
3825 }
3826
3827 sub setup_data_handlers {
3828     my ($class, %data_handler_callbacks) = @_;
3829     %data_handler_callbacks = (
3830       %{$class->default_data_handlers},
3831       %{$class->config->{'data_handlers'}||+{}},
3832       %data_handler_callbacks);
3833
3834     $class->_data_handlers(\%data_handler_callbacks);
3835 }
3836
3837 sub default_data_handlers {
3838     my ($class) = @_;
3839     return +{
3840       'application/x-www-form-urlencoded' => sub {
3841           my ($fh, $req) = @_;
3842           my $params = $req->_use_hash_multivalue ? $req->body_parameters->mixed : $req->body_parameters;
3843           Class::Load::load_first_existing_class('CGI::Struct::XS', 'CGI::Struct')
3844             ->can('build_cgi_struct')->($params);
3845       },
3846       'application/json' => sub {
3847           my ($fh, $req) = @_;
3848           my $parser = Class::Load::load_first_existing_class('JSON::MaybeXS', 'JSON');
3849           my $slurped;
3850           return eval { 
3851             local $/;
3852             $slurped = $fh->getline;
3853             $parser->can("decode_json")->($slurped); # decode_json does utf8 decoding for us
3854           } || Catalyst::Exception->throw(sprintf "Error Parsing POST '%s', Error: %s", (defined($slurped) ? $slurped : 'undef') ,$@);
3855         },
3856     };
3857 }
3858
3859 sub _handle_http_exception {
3860     my ( $self, $error ) = @_;
3861     if (
3862            !$self->config->{always_catch_http_exceptions}
3863         && blessed $error
3864         && (
3865             $error->can('as_psgi')
3866             || (   $error->can('code')
3867                 && $error->code =~ m/^[1-5][0-9][0-9]$/ )
3868         )
3869       )
3870     {
3871         return 1;
3872     }
3873 }
3874
3875 =head2 $c->stack
3876
3877 Returns an arrayref of the internal execution stack (actions that are
3878 currently executing).
3879
3880 =head2 $c->stats
3881
3882 Returns the current timing statistics object. By default Catalyst uses
3883 L<Catalyst::Stats|Catalyst::Stats>, but can be set otherwise with
3884 L<< stats_class|/"$c->stats_class" >>.
3885
3886 Even if L<< -Stats|/"-Stats" >> is not enabled, the stats object is still
3887 available. By enabling it with C< $c->stats->enabled(1) >, it can be used to
3888 profile explicitly, although MyApp.pm still won't profile nor output anything
3889 by itself.
3890
3891 =head2 $c->stats_class
3892
3893 Returns or sets the stats (timing statistics) class. L<Catalyst::Stats|Catalyst::Stats> is used by default.
3894
3895 =head2 $app->stats_class_traits
3896
3897 A arrayref of L<Moose::Role>s that are applied to the stats_class before creating it.
3898
3899 =head2 $app->composed_stats_class
3900
3901 this is the stats_class composed with any 'stats_class_traits'.
3902
3903 =head2 $c->use_stats
3904
3905 Returns 1 when L<< stats collection|/"-Stats" >> is enabled.
3906
3907 Note that this is a static method, not an accessor and should be overridden
3908 by declaring C<sub use_stats { 1 }> in your MyApp.pm, not by calling C<< $c->use_stats(1) >>.
3909
3910 =cut
3911
3912 sub use_stats { 0 }
3913
3914
3915 =head2 $c->write( $data )
3916
3917 Writes $data to the output stream. When using this method directly, you
3918 will need to manually set the C<Content-Length> header to the length of
3919 your output data, if known.
3920
3921 =cut
3922
3923 sub write {
3924     my $c = shift;
3925
3926     # Finalize headers if someone manually writes output (for compat)
3927     $c->finalize_headers;
3928
3929     return $c->response->write( @_ );
3930 }
3931
3932 =head2 version
3933
3934 Returns the Catalyst version number. Mostly useful for "powered by"
3935 messages in template systems.
3936
3937 =cut
3938
3939 sub version { return $Catalyst::VERSION }
3940
3941 =head1 CONFIGURATION
3942
3943 There are a number of 'base' config variables which can be set:
3944
3945 =over
3946
3947 =item *
3948
3949 C<always_catch_http_exceptions> - As of version 5.90060 Catalyst
3950 rethrows errors conforming to the interface described by
3951 L<Plack::Middleware::HTTPExceptions> and lets the middleware deal with it.
3952 Set true to get the deprecated behaviour and have Catalyst catch HTTP exceptions.
3953
3954 =item *
3955
3956 C<default_model> - The default model picked if you say C<< $c->model >>. See L<< /$c->model($name) >>.
3957
3958 =item *
3959
3960 C<default_view> - The default view to be rendered or returned when C<< $c->view >> is called. See L<< /$c->view($name) >>.
3961
3962 =item *
3963
3964 C<disable_component_resolution_regex_fallback> - Turns
3965 off the deprecated component resolution functionality so
3966 that if any of the component methods (e.g. C<< $c->controller('Foo') >>)
3967 are called then regex search will not be attempted on string values and
3968 instead C<undef> will be returned.
3969
3970 =item *
3971
3972 C<home> - The application home directory. In an uninstalled application,
3973 this is the top level application directory. In an installed application,
3974 this will be the directory containing C<< MyApp.pm >>.
3975
3976 =item *
3977
3978 C<ignore_frontend_proxy> - See L</PROXY SUPPORT>
3979
3980 =item *
3981
3982 C<name> - The name of the application in debug messages and the debug and
3983 welcome screens
3984
3985 =item *
3986
3987 C<parse_on_demand> - The request body (for example file uploads) will not be parsed
3988 until it is accessed. This allows you to (for example) check authentication (and reject
3989 the upload) before actually receiving all the data. See L</ON-DEMAND PARSER>
3990
3991 =item *
3992
3993 C<root> - The root directory for templates. Usually this is just a
3994 subdirectory of the home directory, but you can set it to change the
3995 templates to a different directory.
3996
3997 =item *
3998
3999 C<search_extra> - Array reference passed to Module::Pluggable to for additional
4000 namespaces from which components will be loaded (and constructed and stored in
4001 C<< $c->components >>).
4002
4003 =item *
4004
4005 C<show_internal_actions> - If true, causes internal actions such as C<< _DISPATCH >>
4006 to be shown in hit debug tables in the test server.
4007
4008 =item *
4009
4010 C<use_request_uri_for_path> - Controls if the C<REQUEST_URI> or C<PATH_INFO> environment
4011 variable should be used for determining the request path.
4012
4013 Most web server environments pass the requested path to the application using environment variables,
4014 from which Catalyst has to reconstruct the request base (i.e. the top level path to / in the application,
4015 exposed as C<< $c->request->base >>) and the request path below that base.
4016
4017 There are two methods of doing this, both of which have advantages and disadvantages. Which method is used
4018 is determined by the C<< $c->config(use_request_uri_for_path) >> setting (which can either be true or false).
4019
4020 =over
4021
4022 =item use_request_uri_for_path => 0
4023
4024 This is the default (and the) traditional method that Catalyst has used for determining the path information.
4025 The path is generated from a combination of the C<PATH_INFO> and C<SCRIPT_NAME> environment variables.
4026 The allows the application to behave correctly when C<mod_rewrite> is being used to redirect requests
4027 into the application, as these variables are adjusted by mod_rewrite to take account for the redirect.
4028
4029 However this method has the major disadvantage that it is impossible to correctly decode some elements
4030 of the path, as RFC 3875 says: "C<< Unlike a URI path, the PATH_INFO is not URL-encoded, and cannot
4031 contain path-segment parameters. >>" This means PATH_INFO is B<always> decoded, and therefore Catalyst
4032 can't distinguish / vs %2F in paths (in addition to other encoded values).
4033
4034 =item use_request_uri_for_path => 1
4035
4036 This method uses the C<REQUEST_URI> and C<SCRIPT_NAME> environment variables. As C<REQUEST_URI> is never
4037 decoded, this means that applications using this mode can correctly handle URIs including the %2F character
4038 (i.e. with C<AllowEncodedSlashes> set to C<On> in Apache).
4039
4040 Given that this method of path resolution is provably more correct, it is recommended that you use
4041 this unless you have a specific need to deploy your application in a non-standard environment, and you are
4042 aware of the implications of not being able to handle encoded URI paths correctly.
4043
4044 However it also means that in a number of cases when the app isn't installed directly at a path, but instead
4045 is having paths rewritten into it (e.g. as a .cgi/fcgi in a public_html directory, with mod_rewrite in a
4046 .htaccess file, or when SSI is used to rewrite pages into the app, or when sub-paths of the app are exposed
4047 at other URIs than that which the app is 'normally' based at with C<mod_rewrite>), the resolution of
4048 C<< $c->request->base >> will be incorrect.
4049
4050 =back
4051
4052 =item *
4053
4054 C<using_frontend_proxy> - See L</PROXY SUPPORT>.
4055
4056 =item *
4057
4058 C<using_frontend_proxy_path> - Enabled L<Plack::Middleware::ReverseProxyPath> on your application (if
4059 installed, otherwise log an error).  This is useful if your application is not running on the
4060 'root' (or /) of your host server.  B<NOTE> if you use this feature you should add the required
4061 middleware to your project dependency list since its not automatically a dependency of L<Catalyst>.
4062 This has been done since not all people need this feature and we wish to restrict the growth of
4063 L<Catalyst> dependencies.
4064
4065 =item *
4066
4067 C<encoding> - See L</ENCODING>
4068
4069 This now defaults to 'UTF-8'.  You my turn it off by setting this configuration
4070 value to undef.
4071
4072 =item *
4073
4074 C<abort_chain_on_error_fix>
4075
4076 When there is an error in an action chain, the default behavior is to continue
4077 processing the remaining actions and then catch the error upon chain end.  This
4078 can lead to running actions when the application is in an unexpected state.  If
4079 you have this issue, setting this config value to true will promptly exit a
4080 chain when there is an error raised in any action (thus terminating the chain
4081 early.)
4082
4083 use like:
4084
4085     __PACKAGE__->config(abort_chain_on_error_fix => 1);
4086
4087 In the future this might become the default behavior.
4088
4089 =item *
4090
4091 C<use_hash_multivalue_in_request>
4092
4093 In L<Catalyst::Request> the methods C<query_parameters>, C<body_parametes>
4094 and C<parameters> return a hashref where values might be scalar or an arrayref
4095 depending on the incoming data.  In many cases this can be undesirable as it
4096 leads one to writing defensive code like the following:
4097
4098     my ($val) = ref($c->req->parameters->{a}) ?
4099       @{$c->req->parameters->{a}} :
4100         $c->req->parameters->{a};
4101
4102 Setting this configuration item to true will make L<Catalyst> populate the
4103 attributes underlying these methods with an instance of L<Hash::MultiValue>
4104 which is used by L<Plack::Request> and others to solve this very issue.  You
4105 may prefer this behavior to the default, if so enable this option (be warned
4106 if you enable it in a legacy application we are not sure if it is completely
4107 backwardly compatible).
4108
4109 =item *
4110
4111 C<skip_complex_post_part_handling>
4112
4113 When creating body parameters from a POST, if we run into a multpart POST
4114 that does not contain uploads, but instead contains inlined complex data
4115 (very uncommon) we cannot reliably convert that into field => value pairs.  So
4116 instead we create an instance of L<Catalyst::Request::PartData>.  If this causes
4117 issue for you, you can disable this by setting C<skip_complex_post_part_handling>
4118 to true (default is false).  
4119
4120 =item *
4121
4122 C<skip_body_param_unicode_decoding>
4123
4124 Generally we decode incoming POST params based on your declared encoding (the
4125 default for this is to decode UTF-8).  If this is causing you trouble and you
4126 do not wish to turn all encoding support off (with the C<encoding> configuration
4127 parameter) you may disable this step atomically by setting this configuration
4128 parameter to true.
4129
4130 =item *
4131
4132 C<do_not_decode_query>
4133
4134 If true, then do not try to character decode any wide characters in your
4135 request URL query or keywords.  Most readings of the relevent specifications
4136 suggest these should be UTF-* encoded, which is the default that L<Catalyst>
4137 will use, hwoever if you are creating a lot of URLs manually or have external
4138 evil clients, this might cause you trouble.  If you find the changes introduced
4139 in Catalyst version 5.90080+ break some of your query code, you may disable 
4140 the UTF-8 decoding globally using this configuration.
4141
4142 This setting takes precedence over C<default_query_encoding> and
4143 C<decode_query_using_global_encoding>
4144
4145 =item *
4146
4147 C<default_query_encoding>
4148
4149 By default we decode query and keywords in your request URL using UTF-8, which
4150 is our reading of the relevent specifications.  This setting allows one to
4151 specify a fixed value for how to decode your query.  You might need this if
4152 you are doing a lot of custom encoding of your URLs and not using UTF-8.
4153
4154 This setting take precedence over C<decode_query_using_global_encoding>.
4155
4156 =item *
4157
4158 C<decode_query_using_global_encoding>
4159
4160 Setting this to true will default your query decoding to whatever your
4161 general global encoding is (the default is UTF-8).
4162
4163 =item *
4164
4165 C<use_chained_args_0_special_case>
4166
4167 In older versions of Catalyst, when more than one action matched the same path
4168 AND all those matching actions declared Args(0), we'd break the tie by choosing
4169 the first action defined.  We now normalized how Args(0) works so that it
4170 follows the same rule as Args(N), which is to say when we need to break a tie
4171 we choose the LAST action defined.  If this breaks your code and you don't
4172 have time to update to follow the new normalized approach, you may set this
4173 value to true and it will globally revert to the original chaining behavior.
4174
4175 =item *
4176
4177 C<psgi_middleware> - See L<PSGI MIDDLEWARE>.
4178
4179 =item *
4180
4181 C<data_handlers> - See L<DATA HANDLERS>.
4182
4183 =item *
4184
4185 C<stats_class_traits>
4186
4187 An arrayref of L<Moose::Role>s that get componsed into your stats class.
4188
4189 =item *
4190
4191 C<request_class_traits>
4192
4193 An arrayref of L<Moose::Role>s that get componsed into your request class.
4194
4195 =item *
4196
4197 C<response_class_traits>
4198
4199 An arrayref of L<Moose::Role>s that get componsed into your response class.
4200
4201 =item *
4202
4203 C<inject_components>
4204
4205 A Hashref of L<Catalyst::Component> subclasses that are 'injected' into configuration.
4206 For example:
4207
4208     MyApp->config({
4209       inject_components => {
4210         'Controller::Err' => { from_component => 'Local::Controller::Errors' },
4211         'Model::Zoo' => { from_component => 'Local::Model::Foo' },
4212         'Model::Foo' => { from_component => 'Local::Model::Foo', roles => ['TestRole'] },
4213       },
4214       'Controller::Err' => { a => 100, b=>200, namespace=>'error' },
4215       'Model::Zoo' => { a => 2 },
4216       'Model::Foo' => { a => 100 },
4217     });
4218
4219 Generally L<Catalyst> looks for components in your Model/View or Controller directories.
4220 However for cases when you which to use an existing component and you don't need any
4221 customization (where for when you can apply a role to customize it) you may inject those
4222 components into your application.  Please note any configuration should be done 'in the
4223 normal way', with a key under configuration named after the component affix, as in the
4224 above example.
4225
4226 Using this type of injection allows you to construct significant amounts of your application
4227 with only configuration!.  This may or may not lead to increased code understanding.
4228
4229 Please not you may also call the ->inject_components application method as well, although
4230 you must do so BEFORE setup.
4231
4232 =back
4233
4234 =head1 EXCEPTIONS
4235
4236 Generally when you throw an exception inside an Action (or somewhere in
4237 your stack, such as in a model that an Action is calling) that exception
4238 is caught by Catalyst and unless you either catch it yourself (via eval
4239 or something like L<Try::Tiny> or by reviewing the L</error> stack, it
4240 will eventually reach L</finalize_errors> and return either the debugging
4241 error stack page, or the default error page.  However, if your exception
4242 can be caught by L<Plack::Middleware::HTTPExceptions>, L<Catalyst> will
4243 instead rethrow it so that it can be handled by that middleware (which
4244 is part of the default middleware).  For example this would allow
4245
4246     use HTTP::Throwable::Factory 'http_throw';
4247
4248     sub throws_exception :Local {
4249       my ($self, $c) = @_;
4250
4251       http_throw(SeeOther => { location =>
4252         $c->uri_for($self->action_for('redirect')) });
4253
4254     }
4255
4256 =head1 INTERNAL ACTIONS
4257
4258 Catalyst uses internal actions like C<_DISPATCH>, C<_BEGIN>, C<_AUTO>,
4259 C<_ACTION>, and C<_END>. These are by default not shown in the private
4260 action table, but you can make them visible with a config parameter.
4261
4262     MyApp->config(show_internal_actions => 1);
4263
4264 =head1 ON-DEMAND PARSER
4265
4266 The request body is usually parsed at the beginning of a request,
4267 but if you want to handle input yourself, you can enable on-demand
4268 parsing with a config parameter.
4269
4270     MyApp->config(parse_on_demand => 1);
4271
4272 =head1 PROXY SUPPORT
4273
4274 Many production servers operate using the common double-server approach,
4275 with a lightweight frontend web server passing requests to a larger
4276 backend server. An application running on the backend server must deal
4277 with two problems: the remote user always appears to be C<127.0.0.1> and
4278 the server's hostname will appear to be C<localhost> regardless of the
4279 virtual host that the user connected through.
4280
4281 Catalyst will automatically detect this situation when you are running
4282 the frontend and backend servers on the same machine. The following
4283 changes are made to the request.
4284
4285     $c->req->address is set to the user's real IP address, as read from
4286     the HTTP X-Forwarded-For header.
4287
4288     The host value for $c->req->base and $c->req->uri is set to the real
4289     host, as read from the HTTP X-Forwarded-Host header.
4290
4291 Additionally, you may be running your backend application on an insecure
4292 connection (port 80) while your frontend proxy is running under SSL.  If there
4293 is a discrepancy in the ports, use the HTTP header C<X-Forwarded-Port> to
4294 tell Catalyst what port the frontend listens on.  This will allow all URIs to
4295 be created properly.
4296
4297 In the case of passing in:
4298
4299     X-Forwarded-Port: 443
4300
4301 All calls to C<uri_for> will result in an https link, as is expected.
4302
4303 Obviously, your web server must support these headers for this to work.
4304
4305 In a more complex server farm environment where you may have your
4306 frontend proxy server(s) on different machines, you will need to set a
4307 configuration option to tell Catalyst to read the proxied data from the
4308 headers.
4309
4310     MyApp->config(using_frontend_proxy => 1);
4311
4312 If you do not wish to use the proxy support at all, you may set:
4313
4314     MyApp->config(ignore_frontend_proxy => 0);
4315
4316 =head2 Note about psgi files
4317
4318 Note that if you supply your own .psgi file, calling
4319 C<< MyApp->psgi_app(@_); >>, then B<this will not happen automatically>.
4320
4321 You either need to apply L<Plack::Middleware::ReverseProxy> yourself
4322 in your psgi, for example:
4323
4324     builder {
4325         enable "Plack::Middleware::ReverseProxy";
4326         MyApp->psgi_app
4327     };
4328
4329 This will unconditionally add the ReverseProxy support, or you need to call
4330 C<< $app = MyApp->apply_default_middlewares($app) >> (to conditionally
4331 apply the support depending upon your config).
4332
4333 See L<Catalyst::PSGI> for more information.
4334
4335 =head1 THREAD SAFETY
4336
4337 Catalyst has been tested under Apache 2's threading C<mpm_worker>,
4338 C<mpm_winnt>, and the standalone forking HTTP server on Windows. We
4339 believe the Catalyst core to be thread-safe.
4340
4341 If you plan to operate in a threaded environment, remember that all other
4342 modules you are using must also be thread-safe. Some modules, most notably
4343 L<DBD::SQLite>, are not thread-safe.
4344
4345 =head1 DATA HANDLERS
4346
4347 The L<Catalyst::Request> object uses L<HTTP::Body> to populate 'classic' HTML
4348 form parameters and URL search query fields.  However it has become common
4349 for various alternative content types to be PUT or POSTed to your controllers
4350 and actions.  People working on RESTful APIs, or using AJAX often use JSON,
4351 XML and other content types when communicating with an application server.  In
4352 order to better support this use case, L<Catalyst> defines a global configuration
4353 option, C<data_handlers>, which lets you associate a content type with a coderef
4354 that parses that content type into something Perl can readily access.
4355
4356     package MyApp::Web;
4357  
4358     use Catalyst;
4359     use JSON::Maybe;
4360  
4361     __PACKAGE__->config(
4362       data_handlers => {
4363         'application/json' => sub { local $/; decode_json $_->getline },
4364       },
4365       ## Any other configuration.
4366     );
4367  
4368     __PACKAGE__->setup;
4369
4370 By default L<Catalyst> comes with a generic JSON data handler similar to the
4371 example given above, which uses L<JSON::Maybe> to provide either L<JSON::PP>
4372 (a pure Perl, dependency free JSON parser) or L<Cpanel::JSON::XS> if you have
4373 it installed (if you want the faster XS parser, add it to you project Makefile.PL
4374 or dist.ini, cpanfile, etc.)
4375
4376 The C<data_handlers> configuration is a hashref whose keys are HTTP Content-Types
4377 (matched against the incoming request type using a regexp such as to be case
4378 insensitive) and whose values are coderefs that receive a localized version of
4379 C<$_> which is a filehandle object pointing to received body.
4380
4381 This feature is considered an early access release and we reserve the right
4382 to alter the interface in order to provide a performant and secure solution to
4383 alternative request body content.  Your reports welcomed!
4384
4385 =head1 PSGI MIDDLEWARE
4386
4387 You can define middleware, defined as L<Plack::Middleware> or a compatible
4388 interface in configuration.  Your middleware definitions are in the form of an
4389 arrayref under the configuration key C<psgi_middleware>.  Here's an example
4390 with details to follow:
4391
4392     package MyApp::Web;
4393  
4394     use Catalyst;
4395     use Plack::Middleware::StackTrace;
4396  
4397     my $stacktrace_middleware = Plack::Middleware::StackTrace->new;
4398  
4399     __PACKAGE__->config(
4400       'psgi_middleware', [
4401         'Debug',
4402         '+MyApp::Custom',
4403         $stacktrace_middleware,
4404         'Session' => {store => 'File'},
4405         sub {
4406           my $app = shift;
4407           return sub {
4408             my $env = shift;
4409             $env->{myapp.customkey} = 'helloworld';
4410             $app->($env);
4411           },
4412         },
4413       ],
4414     );
4415  
4416     __PACKAGE__->setup;
4417
4418 So the general form is:
4419
4420     __PACKAGE__->config(psgi_middleware => \@middleware_definitions);
4421
4422 Where C<@middleware> is one or more of the following, applied in the REVERSE of
4423 the order listed (to make it function similarly to L<Plack::Builder>:
4424
4425 Alternatively, you may also define middleware by calling the L</setup_middleware>
4426 package method:
4427
4428     package MyApp::Web;
4429
4430     use Catalyst;
4431
4432     __PACKAGE__->setup_middleware( \@middleware_definitions);
4433     __PACKAGE__->setup;
4434
4435 In the case where you do both (use 'setup_middleware' and configuration) the
4436 package call to setup_middleware will be applied earlier (in other words its
4437 middleware will wrap closer to the application).  Keep this in mind since in
4438 some cases the order of middleware is important.
4439
4440 The two approaches are not exclusive.
4441  
4442 =over 4
4443  
4444 =item Middleware Object
4445  
4446 An already initialized object that conforms to the L<Plack::Middleware>
4447 specification:
4448  
4449     my $stacktrace_middleware = Plack::Middleware::StackTrace->new;
4450  
4451     __PACKAGE__->config(
4452       'psgi_middleware', [
4453         $stacktrace_middleware,
4454       ]);
4455  
4456  
4457 =item coderef
4458  
4459 A coderef that is an inlined middleware:
4460  
4461     __PACKAGE__->config(
4462       'psgi_middleware', [
4463         sub {
4464           my $app = shift;
4465           return sub {
4466             my $env = shift;
4467             if($env->{PATH_INFO} =~m/forced/) {
4468               Plack::App::File
4469                 ->new(file=>TestApp->path_to(qw/share static forced.txt/))
4470                 ->call($env);
4471             } else {
4472               return $app->($env);
4473             }
4474          },
4475       },
4476     ]);
4477  
4478  
4479  
4480 =item a scalar
4481  
4482 We assume the scalar refers to a namespace after normalizing it using the
4483 following rules:
4484
4485 (1) If the scalar is prefixed with a "+" (as in C<+MyApp::Foo>) then the full string
4486 is assumed to be 'as is', and we just install and use the middleware.
4487
4488 (2) If the scalar begins with "Plack::Middleware" or your application namespace
4489 (the package name of your Catalyst application subclass), we also assume then
4490 that it is a full namespace, and use it.
4491
4492 (3) Lastly, we then assume that the scalar is a partial namespace, and attempt to
4493 resolve it first by looking for it under your application namespace (for example
4494 if you application is "MyApp::Web" and the scalar is "MyMiddleware", we'd look
4495 under "MyApp::Web::Middleware::MyMiddleware") and if we don't find it there, we
4496 will then look under the regular L<Plack::Middleware> namespace (i.e. for the
4497 previous we'd try "Plack::Middleware::MyMiddleware").  We look under your application
4498 namespace first to let you 'override' common L<Plack::Middleware> locally, should
4499 you find that a good idea.
4500
4501 Examples:
4502
4503     package MyApp::Web;
4504
4505     __PACKAGE__->config(
4506       'psgi_middleware', [
4507         'Debug',  ## MyAppWeb::Middleware::Debug->wrap or Plack::Middleware::Debug->wrap
4508         'Plack::Middleware::Stacktrace', ## Plack::Middleware::Stacktrace->wrap
4509         '+MyApp::Custom',  ## MyApp::Custom->wrap
4510       ],
4511     );
4512  
4513 =item a scalar followed by a hashref
4514  
4515 Just like the previous, except the following C<HashRef> is used as arguments
4516 to initialize the middleware object.
4517  
4518     __PACKAGE__->config(
4519       'psgi_middleware', [
4520          'Session' => {store => 'File'},
4521     ]);
4522
4523 =back
4524
4525 Please see L<PSGI> for more on middleware.
4526
4527 =head1 ENCODING
4528
4529 Starting in L<Catalyst> version 5.90080 encoding is automatically enabled
4530 and set to encode all body responses to UTF8 when possible and applicable.
4531 Following is documentation on this process.  If you are using an older
4532 version of L<Catalyst> you should review documentation for that version since
4533 a lot has changed.
4534
4535 By default encoding is now 'UTF-8'.  You may turn it off by setting
4536 the encoding configuration to undef.
4537
4538     MyApp->config(encoding => undef);
4539
4540 This is recommended for temporary backwards compatibility only.
4541
4542 Encoding is automatically applied when the content-type is set to
4543 a type that can be encoded.  Currently we encode when the content type
4544 matches the following regular expression:
4545
4546     $content_type =~ /^text|xml$|javascript$/
4547
4548 Encoding is set on the application, but it is copied to the context object
4549 so that you can override it on a request basis.
4550
4551 Be default we don't automatically encode 'application/json' since the most
4552 common approaches to generating this type of response (Either via L<Catalyst::View::JSON>
4553 or L<Catalyst::Action::REST>) will do so already and we want to avoid double
4554 encoding issues.
4555
4556 If you are producing JSON response in an unconventional manner (such
4557 as via a template or manual strings) you should perform the UTF8 encoding
4558 manually as well such as to conform to the JSON specification.
4559
4560 NOTE: We also examine the value of $c->response->content_encoding.  If
4561 you set this (like for example 'gzip', and manually gzipping the body)
4562 we assume that you have done all the necessary encoding yourself, since
4563 we cannot encode the gzipped contents.  If you use a plugin like
4564 L<Catalyst::Plugin::Compress> you need to update to a modern version in order
4565 to have this function correctly  with the new UTF8 encoding code, or you
4566 can use L<Plack::Middleware::Deflater> or (probably best) do your compression on
4567 a front end proxy.
4568
4569 =head2 Methods
4570
4571 =over 4
4572
4573 =item encoding
4574
4575 Returns an instance of an C<Encode> encoding
4576
4577     print $c->encoding->name
4578
4579 =item handle_unicode_encoding_exception ($exception_context)
4580
4581 Method called when decoding process for a request fails.
4582
4583 An C<$exception_context> hashref is provided to allow you to override the
4584 behaviour of your application when given data with incorrect encodings.
4585
4586 The default method throws exceptions in the case of invalid request parameters
4587 (resulting in a 500 error), but ignores errors in upload filenames.
4588
4589 The keys passed in the C<$exception_context> hash are:
4590
4591 =over
4592
4593 =item param_value
4594
4595 The value which was not able to be decoded.
4596
4597 =item error_msg
4598
4599 The exception received from L<Encode>.
4600
4601 =item encoding_step
4602
4603 What type of data was being decoded. Valid values are (currently)
4604 C<params> - for request parameters / arguments / captures
4605 and C<uploads> - for request upload filenames.
4606
4607 =back
4608
4609 =back
4610
4611 =head1 SUPPORT
4612
4613 IRC:
4614
4615     Join #catalyst on irc.perl.org.
4616
4617 Mailing Lists:
4618
4619     http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
4620     http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst-dev
4621
4622 Web:
4623
4624     http://catalyst.perl.org
4625
4626 Wiki:
4627
4628     http://dev.catalyst.perl.org
4629
4630 =head1 SEE ALSO
4631
4632 =head2 L<Task::Catalyst> - All you need to start with Catalyst
4633
4634 =head2 L<Catalyst::Manual> - The Catalyst Manual
4635
4636 =head2 L<Catalyst::Component>, L<Catalyst::Controller> - Base classes for components
4637
4638 =head2 L<Catalyst::Engine> - Core engine
4639
4640 =head2 L<Catalyst::Log> - Log class.
4641
4642 =head2 L<Catalyst::Request> - Request object
4643
4644 =head2 L<Catalyst::Response> - Response object
4645
4646 =head2 L<Catalyst::Test> - The test suite.
4647
4648 =head1 PROJECT FOUNDER
4649
4650 sri: Sebastian Riedel <sri@cpan.org>
4651
4652 =head1 CONTRIBUTORS
4653
4654 abw: Andy Wardley
4655
4656 acme: Leon Brocard <leon@astray.com>
4657
4658 abraxxa: Alexander Hartmaier <abraxxa@cpan.org>
4659
4660 andrewalker: André Walker <andre@cpan.org>
4661
4662 Andrew Bramble
4663
4664 Andrew Ford E<lt>A.Ford@ford-mason.co.ukE<gt>
4665
4666 Andrew Ruthven
4667
4668 andyg: Andy Grundman <andy@hybridized.org>
4669
4670 audreyt: Audrey Tang
4671
4672 bricas: Brian Cassidy <bricas@cpan.org>
4673
4674 Caelum: Rafael Kitover <rkitover@io.com>
4675
4676 chansen: Christian Hansen
4677
4678 chicks: Christopher Hicks
4679
4680 Chisel Wright C<pause@herlpacker.co.uk>
4681
4682 Danijel Milicevic C<me@danijel.de>
4683
4684 davewood: David Schmidt <davewood@cpan.org>
4685
4686 David Kamholz E<lt>dkamholz@cpan.orgE<gt>
4687
4688 David Naughton, C<naughton@umn.edu>
4689
4690 David E. Wheeler
4691
4692 dhoss: Devin Austin <dhoss@cpan.org>
4693
4694 dkubb: Dan Kubb <dan.kubb-cpan@onautopilot.com>
4695
4696 Drew Taylor
4697
4698 dwc: Daniel Westermann-Clark <danieltwc@cpan.org>
4699
4700 esskar: Sascha Kiefer
4701
4702 fireartist: Carl Franks <cfranks@cpan.org>
4703
4704 frew: Arthur Axel "fREW" Schmidt <frioux@gmail.com>
4705
4706 gabb: Danijel Milicevic
4707
4708 Gary Ashton Jones
4709
4710 Gavin Henry C<ghenry@perl.me.uk>
4711
4712 Geoff Richards
4713
4714 groditi: Guillermo Roditi <groditi@gmail.com>
4715
4716 hobbs: Andrew Rodland <andrew@cleverdomain.org>
4717
4718 ilmari: Dagfinn Ilmari MannsÃ¥ker <ilmari@ilmari.org>
4719
4720 jcamacho: Juan Camacho
4721
4722 jester: Jesse Sheidlower C<jester@panix.com>
4723
4724 jhannah: Jay Hannah <jay@jays.net>
4725
4726 Jody Belka
4727
4728 Johan Lindstrom
4729
4730 jon: Jon Schutz <jjschutz@cpan.org>
4731
4732 Jonathan Rockway C<< <jrockway@cpan.org> >>
4733
4734 Kieren Diment C<kd@totaldatasolution.com>
4735
4736 konobi: Scott McWhirter <konobi@cpan.org>
4737
4738 marcus: Marcus Ramberg <mramberg@cpan.org>
4739
4740 miyagawa: Tatsuhiko Miyagawa <miyagawa@bulknews.net>
4741
4742 mgrimes: Mark Grimes <mgrimes@cpan.org>
4743
4744 mst: Matt S. Trout <mst@shadowcatsystems.co.uk>
4745
4746 mugwump: Sam Vilain
4747
4748 naughton: David Naughton
4749
4750 ningu: David Kamholz <dkamholz@cpan.org>
4751
4752 nothingmuch: Yuval Kogman <nothingmuch@woobling.org>
4753
4754 numa: Dan Sully <daniel@cpan.org>
4755
4756 obra: Jesse Vincent
4757
4758 Octavian Rasnita
4759
4760 omega: Andreas Marienborg
4761
4762 Oleg Kostyuk <cub.uanic@gmail.com>
4763
4764 phaylon: Robert Sedlacek <phaylon@dunkelheit.at>
4765
4766 rafl: Florian Ragwitz <rafl@debian.org>
4767
4768 random: Roland Lammel <lammel@cpan.org>
4769
4770 Robert Sedlacek C<< <rs@474.at> >>
4771
4772 SpiceMan: Marcel Montes
4773
4774 sky: Arthur Bergman
4775
4776 szbalint: Balint Szilakszi <szbalint@cpan.org>
4777
4778 t0m: Tomas Doran <bobtfish@bobtfish.net>
4779
4780 Ulf Edvinsson
4781
4782 vanstyn: Henry Van Styn <vanstyn@cpan.org>
4783
4784 Viljo Marrandi C<vilts@yahoo.com>
4785
4786 Will Hawes C<info@whawes.co.uk>
4787
4788 willert: Sebastian Willert <willert@cpan.org>
4789
4790 wreis: Wallace Reis <wreis@cpan.org>
4791
4792 Yuval Kogman, C<nothingmuch@woobling.org>
4793
4794 rainboxx: Matthias Dietrich, C<perl@rainboxx.de>
4795
4796 dd070: Dhaval Dhanani <dhaval070@gmail.com>
4797
4798 Upasana <me@upasana.me>
4799
4800 John Napiorkowski (jnap) <jjnapiork@cpan.org>
4801
4802 =head1 COPYRIGHT
4803
4804 Copyright (c) 2005-2015, the above named PROJECT FOUNDER and CONTRIBUTORS.
4805
4806 =head1 LICENSE
4807
4808 This library is free software. You can redistribute it and/or modify it under
4809 the same terms as Perl itself.
4810
4811 =cut
4812
4813 no Moose;
4814
4815 __PACKAGE__->meta->make_immutable;
4816
4817 1;