make sure injected comps have the correct namespace
[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     my @injected = $class->setup_injected_components;
2858
2859     # All components are registered, now we need to 'init' them.
2860     foreach my $component_name (@injected, @comps) {
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     return map { $class ."::" . $_ }
2883       @injected_components;
2884 }
2885
2886 =head2 $app->setup_injected_component( $injected_component_name, $config )
2887
2888 Setup a given injected component.
2889
2890 =cut
2891
2892 sub setup_injected_component {
2893     my ($class, $injected_comp_name, $config) = @_;
2894     if(my $component_class = $config->{from_component}) {
2895         my @roles = @{$config->{roles} ||[]};
2896         Catalyst::Utils::inject_component(
2897           into => $class,
2898           component => $component_class,
2899           (scalar(@roles) ? (traits => \@roles) : ()),
2900           as => $injected_comp_name);
2901     }
2902 }
2903
2904 =head2 $app->inject_component($MyApp_Component_name => \%args);
2905
2906 Add a component that is injected at setup:
2907
2908     MyApp->inject_component( 'Model::Foo' => { from_component => 'Common::Foo' } );
2909
2910 Must be called before ->setup.  Expects a component name for your
2911 current application and \%args where
2912
2913 =over 4
2914
2915 =item from_component
2916
2917 The target component being injected into your application
2918
2919 =item roles
2920
2921 An arrayref of L<Moose::Role>s that are applied to your component.
2922
2923 =back
2924
2925 Example
2926
2927     MyApp->inject_component(
2928       'Model::Foo' => {
2929         from_component => 'Common::Model::Foo',
2930         roles => ['Role1', 'Role2'],
2931       });
2932
2933 =head2 $app->inject_components
2934
2935 Inject a list of components:
2936
2937     MyApp->inject_components(
2938       'Model::FooOne' => {
2939         from_component => 'Common::Model::Foo',
2940         roles => ['Role1', 'Role2'],
2941       },
2942       'Model::FooTwo' => {
2943         from_component => 'Common::Model::Foo',
2944         roles => ['Role1', 'Role2'],
2945       });
2946
2947 =cut
2948
2949 sub inject_component {
2950   my ($app, $name, $args) = @_;
2951   die "Component $name exists" if
2952     $app->config->{inject_components}->{$name};
2953   $app->config->{inject_components}->{$name} = $args;
2954 }
2955
2956 sub inject_components {
2957   my $app = shift;
2958   while(@_) {
2959     $app->inject_component(shift, shift);
2960   }
2961 }
2962
2963 =head2 $c->locate_components( $setup_component_config )
2964
2965 This method is meant to provide a list of component modules that should be
2966 setup for the application.  By default, it will use L<Module::Pluggable>.
2967
2968 Specify a C<setup_components> config option to pass additional options directly
2969 to L<Module::Pluggable>. To add additional search paths, specify a key named
2970 C<search_extra> as an array reference. Items in the array beginning with C<::>
2971 will have the application class name prepended to them.
2972
2973 =cut
2974
2975 sub locate_components {
2976     my $class  = shift;
2977     my $config = shift;
2978
2979     my @paths   = qw( ::M ::Model ::V ::View ::C ::Controller );
2980     my $extra   = delete $config->{ search_extra } || [];
2981
2982     unshift @paths, @$extra;
2983
2984     my @comps = map { sort { length($a) <=> length($b) } Module::Pluggable::Object->new(
2985       search_path => [ map { s/^(?=::)/$class/; $_; } ($_) ],
2986       %$config
2987     )->plugins } @paths;
2988
2989     return @comps;
2990 }
2991
2992 =head2 $c->expand_component_module( $component, $setup_component_config )
2993
2994 Components found by C<locate_components> will be passed to this method, which
2995 is expected to return a list of component (package) names to be set up.
2996
2997 =cut
2998
2999 sub expand_component_module {
3000     my ($class, $module) = @_;
3001     return Devel::InnerPackage::list_packages( $module );
3002 }
3003
3004 =head2 $app->delayed_setup_component
3005
3006 Returns a coderef that points to a setup_component instance.  Used
3007 internally for when you want to delay setup until the first time
3008 the component is called.
3009
3010 =cut
3011
3012 sub delayed_setup_component {
3013   my($class, $component, @more) = @_;
3014   return sub {
3015     return my $instance = $class->setup_component($component, @more);
3016   };
3017 }
3018
3019 =head2 $c->setup_component
3020
3021 =cut
3022
3023 sub setup_component {
3024     my( $class, $component ) = @_;
3025
3026     unless ( $component->can( 'COMPONENT' ) ) {
3027         return $component;
3028     }
3029
3030     my $config = $class->config_for($component);
3031     # Stash catalyst_component_name in the config here, so that custom COMPONENT
3032     # methods also pass it. local to avoid pointlessly shitting in config
3033     # for the debug screen, as $component is already the key name.
3034     local $config->{catalyst_component_name} = $component;
3035
3036     my $instance = eval {
3037       $component->COMPONENT( $class, $config );
3038     } || do {
3039       my $error = $@;
3040       chomp $error;
3041       Catalyst::Exception->throw(
3042         message => qq/Couldn't instantiate component "$component", "$error"/
3043       );
3044     };
3045
3046     unless (blessed $instance) {
3047         my $metaclass = Moose::Util::find_meta($component);
3048         my $method_meta = $metaclass->find_method_by_name('COMPONENT');
3049         my $component_method_from = $method_meta->associated_metaclass->name;
3050         my $value = defined($instance) ? $instance : 'undef';
3051         Catalyst::Exception->throw(
3052             message =>
3053             qq/Couldn't instantiate component "$component", COMPONENT() method (from $component_method_from) didn't return an object-like value (value was $value)./
3054         );
3055     }
3056
3057     my @expanded_components = $instance->can('expand_modules')
3058       ? $instance->expand_modules( $component, $config )
3059       : $class->expand_component_module( $component, $config );
3060     for my $component (@expanded_components) {
3061       next if $class->components->{ $component };
3062       $class->components->{ $component } = $class->setup_component($component);
3063     }
3064
3065     return $instance; 
3066 }
3067
3068 =head2 $app->config_for( $component_name )
3069
3070 Return the application level configuration (which is not yet merged with any
3071 local component configuration, via $component_class->config) for the named
3072 component or component object. Example:
3073
3074     MyApp->config(
3075       'Model::Foo' => { a => 1, b => 2},
3076     );
3077
3078     my $config = MyApp->config_for('MyApp::Model::Foo');
3079
3080 In this case $config is the hashref C< {a=>1, b=>2} >.
3081
3082 This is also handy for looking up configuration for a plugin, to make sure you follow
3083 existing L<Catalyst> standards for where a plugin should put its configuration.
3084
3085 =cut
3086
3087 sub config_for {
3088     my ($class, $component_name) = @_;
3089     my $component_suffix = Catalyst::Utils::class2classsuffix($component_name);
3090     my $config = $class->config->{ $component_suffix } || {};
3091
3092     return $config;
3093 }
3094
3095 =head2 $c->setup_dispatcher
3096
3097 Sets up dispatcher.
3098
3099 =cut
3100
3101 sub setup_dispatcher {
3102     my ( $class, $dispatcher ) = @_;
3103
3104     if ($dispatcher) {
3105         $dispatcher = 'Catalyst::Dispatcher::' . $dispatcher;
3106     }
3107
3108     if ( my $env = Catalyst::Utils::env_value( $class, 'DISPATCHER' ) ) {
3109         $dispatcher = 'Catalyst::Dispatcher::' . $env;
3110     }
3111
3112     unless ($dispatcher) {
3113         $dispatcher = $class->dispatcher_class;
3114     }
3115
3116     load_class($dispatcher);
3117
3118     # dispatcher instance
3119     $class->dispatcher( $dispatcher->new );
3120 }
3121
3122 =head2 $c->setup_engine
3123
3124 Sets up engine.
3125
3126 =cut
3127
3128 sub engine_class {
3129     my ($class, $requested_engine) = @_;
3130
3131     if (!$class->engine_loader || $requested_engine) {
3132         $class->engine_loader(
3133             Catalyst::EngineLoader->new({
3134                 application_name => $class,
3135                 (defined $requested_engine
3136                      ? (catalyst_engine_class => $requested_engine) : ()),
3137             }),
3138         );
3139     }
3140
3141     $class->engine_loader->catalyst_engine_class;
3142 }
3143
3144 sub setup_engine {
3145     my ($class, $requested_engine) = @_;
3146
3147     my $engine = do {
3148         my $loader = $class->engine_loader;
3149
3150         if (!$loader || $requested_engine) {
3151             $loader = Catalyst::EngineLoader->new({
3152                 application_name => $class,
3153                 (defined $requested_engine
3154                      ? (requested_engine => $requested_engine) : ()),
3155             }),
3156
3157             $class->engine_loader($loader);
3158         }
3159
3160         $loader->catalyst_engine_class;
3161     };
3162
3163     # Don't really setup_engine -- see _setup_psgi_app for explanation.
3164     return if $class->loading_psgi_file;
3165
3166     load_class($engine);
3167
3168     if ($ENV{MOD_PERL}) {
3169         my $apache = $class->engine_loader->auto;
3170
3171         my $meta = find_meta($class);
3172         my $was_immutable = $meta->is_immutable;
3173         my %immutable_options = $meta->immutable_options;
3174         $meta->make_mutable if $was_immutable;
3175
3176         $meta->add_method(handler => sub {
3177             my $r = shift;
3178             my $psgi_app = $class->_finalized_psgi_app;
3179             $apache->call_app($r, $psgi_app);
3180         });
3181
3182         $meta->make_immutable(%immutable_options) if $was_immutable;
3183     }
3184
3185     $class->engine( $engine->new );
3186
3187     return;
3188 }
3189
3190 ## This exists just to supply a prebuild psgi app for mod_perl and for the 
3191 ## build in server support (back compat support for pre psgi port behavior).
3192 ## This is so that we don't build a new psgi app for each request when using
3193 ## the mod_perl handler or the built in servers (http and fcgi, etc).
3194
3195 sub _finalized_psgi_app {
3196     my ($app) = @_;
3197
3198     unless ($app->_psgi_app) {
3199         my $psgi_app = $app->_setup_psgi_app;
3200         $app->_psgi_app($psgi_app);
3201     }
3202
3203     return $app->_psgi_app;
3204 }
3205
3206 ## Look for a psgi file like 'myapp_web.psgi' (if the app is MyApp::Web) in the
3207 ## home directory and load that and return it (just assume it is doing the 
3208 ## right thing :) ).  If that does not exist, call $app->psgi_app, wrap that
3209 ## in default_middleware and return it ( this is for backward compatibility
3210 ## with pre psgi port behavior ).
3211
3212 sub _setup_psgi_app {
3213     my ($app) = @_;
3214
3215     for my $home (Path::Class::Dir->new($app->config->{home})) {
3216         my $psgi_file = $home->file(
3217             Catalyst::Utils::appprefix($app) . '.psgi',
3218         );
3219
3220         next unless -e $psgi_file;
3221
3222         # If $psgi_file calls ->setup_engine, it's doing so to load
3223         # Catalyst::Engine::PSGI. But if it does that, we're only going to
3224         # throw away the loaded PSGI-app and load the 5.9 Catalyst::Engine
3225         # anyway. So set a flag (ick) that tells setup_engine not to populate
3226         # $c->engine or do any other things we might regret.
3227
3228         $app->loading_psgi_file(1);
3229         my $psgi_app = Plack::Util::load_psgi($psgi_file);
3230         $app->loading_psgi_file(0);
3231
3232         return $psgi_app
3233             unless $app->engine_loader->needs_psgi_engine_compat_hack;
3234
3235         warn <<"EOW";
3236 Found a legacy Catalyst::Engine::PSGI .psgi file at ${psgi_file}.
3237
3238 Its content has been ignored. Please consult the Catalyst::Upgrading
3239 documentation on how to upgrade from Catalyst::Engine::PSGI.
3240 EOW
3241     }
3242
3243     return $app->apply_default_middlewares($app->psgi_app);
3244 }
3245
3246 =head2 $c->apply_default_middlewares
3247
3248 Adds the following L<Plack> middlewares to your application, since they are
3249 useful and commonly needed:
3250
3251 L<Plack::Middleware::LighttpdScriptNameFix> (if you are using Lighttpd),
3252 L<Plack::Middleware::IIS6ScriptNameFix> (always applied since this middleware
3253 is smart enough to conditionally apply itself).
3254
3255 We will also automatically add L<Plack::Middleware::ReverseProxy> if we notice
3256 that your HTTP $env variable C<REMOTE_ADDR> is '127.0.0.1'.  This is usually
3257 an indication that your server is running behind a proxy frontend.  However in
3258 2014 this is often not the case.  We preserve this code for backwards compatibility
3259 however I B<highly> recommend that if you are running the server behind a front
3260 end proxy that you clearly indicate so with the C<using_frontend_proxy> configuration
3261 setting to true for your environment configurations that run behind a proxy.  This
3262 way if you change your front end proxy address someday your code would inexplicably
3263 stop working as expected.
3264
3265 Additionally if we detect we are using Nginx, we add a bit of custom middleware
3266 to solve some problems with the way that server handles $ENV{PATH_INFO} and
3267 $ENV{SCRIPT_NAME}.
3268
3269 Please B<NOTE> that if you do use C<using_frontend_proxy> the middleware is now
3270 adding via C<registered_middleware> rather than this method.
3271
3272 If you are using Lighttpd or IIS6 you may wish to apply these middlewares.  In
3273 general this is no longer a common case but we have this here for backward
3274 compatibility.
3275
3276 =cut
3277
3278
3279 sub apply_default_middlewares {
3280     my ($app, $psgi_app) = @_;
3281
3282     # Don't add this conditional IF we are explicitly saying we want the
3283     # frontend proxy support.  We don't need it here since if that is the
3284     # case it will be always loaded in the default_middleware.
3285
3286     unless($app->config->{using_frontend_proxy}) {
3287       $psgi_app = Plack::Middleware::Conditional->wrap(
3288           $psgi_app,
3289           builder   => sub { Plack::Middleware::ReverseProxy->wrap($_[0]) },
3290           condition => sub {
3291               my ($env) = @_;
3292               return if $app->config->{ignore_frontend_proxy};
3293               return $env->{REMOTE_ADDR} eq '127.0.0.1';
3294           },
3295       );
3296     }
3297
3298     # If we're running under Lighttpd, swap PATH_INFO and SCRIPT_NAME
3299     # http://lists.scsys.co.uk/pipermail/catalyst/2006-June/008361.html
3300     $psgi_app = Plack::Middleware::Conditional->wrap(
3301         $psgi_app,
3302         builder   => sub { Plack::Middleware::LighttpdScriptNameFix->wrap($_[0]) },
3303         condition => sub {
3304             my ($env) = @_;
3305             return unless $env->{SERVER_SOFTWARE} && $env->{SERVER_SOFTWARE} =~ m!lighttpd[-/]1\.(\d+\.\d+)!;
3306             return unless $1 < 4.23;
3307             1;
3308         },
3309     );
3310
3311     # we're applying this unconditionally as the middleware itself already makes
3312     # sure it doesn't fuck things up if it's not running under one of the right
3313     # IIS versions
3314     $psgi_app = Plack::Middleware::IIS6ScriptNameFix->wrap($psgi_app);
3315
3316     # And another IIS issue, this time with IIS7.
3317     $psgi_app = Plack::Middleware::Conditional->wrap(
3318         $psgi_app,
3319         builder => sub { Plack::Middleware::IIS7KeepAliveFix->wrap($_[0]) },
3320         condition => sub {
3321             my ($env) = @_;
3322             return $env->{SERVER_SOFTWARE} && $env->{SERVER_SOFTWARE} =~ m!IIS/7\.[0-9]!;
3323         },
3324     );
3325
3326     return $psgi_app;
3327 }
3328
3329 =head2 App->psgi_app
3330
3331 =head2 App->to_app
3332
3333 Returns a PSGI application code reference for the catalyst application
3334 C<$c>. This is the bare application created without the C<apply_default_middlewares>
3335 method called.  We do however apply C<registered_middleware> since those are
3336 integral to how L<Catalyst> functions.  Also, unlike starting your application
3337 with a generated server script (via L<Catalyst::Devel> and C<catalyst.pl>) we do
3338 not attempt to return a valid L<PSGI> application using any existing C<${myapp}.psgi>
3339 scripts in your $HOME directory.
3340
3341 B<NOTE> C<apply_default_middlewares> was originally created when the first PSGI
3342 port was done for v5.90000.  These are middlewares that are added to achieve
3343 backward compatibility with older applications.  If you start your application
3344 using one of the supplied server scripts (generated with L<Catalyst::Devel> and
3345 the project skeleton script C<catalyst.pl>) we apply C<apply_default_middlewares>
3346 automatically.  This was done so that pre and post PSGI port applications would
3347 work the same way.
3348
3349 This is what you want to be using to retrieve the PSGI application code
3350 reference of your Catalyst application for use in a custom F<.psgi> or in your
3351 own created server modules.
3352
3353 =cut
3354
3355 *to_app = \&psgi_app;
3356
3357 sub psgi_app {
3358     my ($app) = @_;
3359     my $psgi = $app->engine->build_psgi_app($app);
3360     return $app->Catalyst::Utils::apply_registered_middleware($psgi);
3361 }
3362
3363 =head2 $c->setup_home
3364
3365 Sets up the home directory.
3366
3367 =cut
3368
3369 sub setup_home {
3370     my ( $class, $home ) = @_;
3371
3372     if ( my $env = Catalyst::Utils::env_value( $class, 'HOME' ) ) {
3373         $home = $env;
3374     }
3375
3376     $home ||= Catalyst::Utils::home($class);
3377
3378     if ($home) {
3379         #I remember recently being scolded for assigning config values like this
3380         $class->config->{home} ||= $home;
3381         $class->config->{root} ||= Path::Class::Dir->new($home)->subdir('root');
3382     }
3383 }
3384
3385 =head2 $c->setup_encoding
3386
3387 Sets up the input/output encoding. See L<ENCODING>
3388
3389 =cut
3390
3391 sub setup_encoding {
3392     my $c = shift;
3393     if( exists($c->config->{encoding}) && !defined($c->config->{encoding}) ) {
3394         # Ok, so the user has explicitly said "I don't want encoding..."
3395         return;
3396     } else {
3397       my $enc = defined($c->config->{encoding}) ?
3398         delete $c->config->{encoding} : 'UTF-8'; # not sure why we delete it... (JNAP)
3399       $c->encoding($enc);
3400     }
3401 }
3402
3403 =head2 handle_unicode_encoding_exception
3404
3405 Hook to let you customize how encoding errors are handled.  By default
3406 we just throw an exception.  Receives a hashref of debug information.
3407 Example:
3408
3409     $c->handle_unicode_encoding_exception({
3410         param_value => $value,
3411         error_msg => $_,
3412             encoding_step => 'params',
3413         });
3414
3415 =cut
3416
3417 sub handle_unicode_encoding_exception {
3418     my ( $self, $exception_ctx ) = @_;
3419     die $exception_ctx->{error_msg};
3420 }
3421
3422 # Some unicode helpers cargo culted from the old plugin.  These could likely
3423 # be neater.
3424
3425 sub _handle_unicode_decoding {
3426     my ( $self, $value ) = @_;
3427
3428     return unless defined $value;
3429
3430     ## I think this mess is to support the old nested
3431     if ( ref $value eq 'ARRAY' ) {
3432         foreach ( @$value ) {
3433             $_ = $self->_handle_unicode_decoding($_);
3434         }
3435         return $value;
3436     }
3437     elsif ( ref $value eq 'HASH' ) {
3438         foreach (keys %$value) {
3439             my $encoded_key = $self->_handle_param_unicode_decoding($_);
3440             $value->{$encoded_key} = $self->_handle_unicode_decoding($value->{$_});
3441
3442             # If the key was encoded we now have two (the original and current so
3443             # delete the original.
3444             delete $value->{$_} if $_ ne $encoded_key;
3445         }
3446         return $value;
3447     }
3448     else {
3449         return $self->_handle_param_unicode_decoding($value);
3450     }
3451 }
3452
3453 sub _handle_param_unicode_decoding {
3454     my ( $self, $value ) = @_;
3455     return unless defined $value; # not in love with just ignoring undefs - jnap
3456     return $value if blessed($value); #don't decode when the value is an object.
3457
3458     my $enc = $self->encoding;
3459     return try {
3460       $enc->decode( $value, $self->_encode_check );
3461     }
3462     catch {
3463         $self->handle_unicode_encoding_exception({
3464             param_value => $value,
3465             error_msg => $_,
3466             encoding_step => 'params',
3467         });
3468     };
3469 }
3470
3471 =head2 $c->setup_log
3472
3473 Sets up log by instantiating a L<Catalyst::Log|Catalyst::Log> object and
3474 passing it to C<log()>. Pass in a comma-delimited list of levels to set the
3475 log to.
3476
3477 This method also installs a C<debug> method that returns a true value into the
3478 catalyst subclass if the "debug" level is passed in the comma-delimited list,
3479 or if the C<$CATALYST_DEBUG> environment variable is set to a true value.
3480
3481 Note that if the log has already been setup, by either a previous call to
3482 C<setup_log> or by a call such as C<< __PACKAGE__->log( MyLogger->new ) >>,
3483 that this method won't actually set up the log object.
3484
3485 =cut
3486
3487 sub setup_log {
3488     my ( $class, $levels ) = @_;
3489
3490     $levels ||= '';
3491     $levels =~ s/^\s+//;
3492     $levels =~ s/\s+$//;
3493     my %levels = map { $_ => 1 } split /\s*,\s*/, $levels;
3494
3495     my $env_debug = Catalyst::Utils::env_value( $class, 'DEBUG' );
3496     if ( defined $env_debug ) {
3497         $levels{debug} = 1 if $env_debug; # Ugly!
3498         delete($levels{debug}) unless $env_debug;
3499     }
3500
3501     unless ( $class->log ) {
3502         $class->log( Catalyst::Log->new(keys %levels) );
3503     }
3504
3505     if ( $levels{debug} ) {
3506         Class::MOP::get_metaclass_by_name($class)->add_method('debug' => sub { 1 });
3507         $class->log->debug('Debug messages enabled');
3508     }
3509 }
3510
3511 =head2 $c->setup_plugins
3512
3513 Sets up plugins.
3514
3515 =cut
3516
3517 =head2 $c->setup_stats
3518
3519 Sets up timing statistics class.
3520
3521 =cut
3522
3523 sub setup_stats {
3524     my ( $class, $stats ) = @_;
3525
3526     Catalyst::Utils::ensure_class_loaded($class->stats_class);
3527
3528     my $env = Catalyst::Utils::env_value( $class, 'STATS' );
3529     if ( defined($env) ? $env : ($stats || $class->debug ) ) {
3530         Class::MOP::get_metaclass_by_name($class)->add_method('use_stats' => sub { 1 });
3531         $class->log->debug('Statistics enabled');
3532     }
3533 }
3534
3535
3536 =head2 $c->registered_plugins
3537
3538 Returns a sorted list of the plugins which have either been stated in the
3539 import list.
3540
3541 If passed a given plugin name, it will report a boolean value indicating
3542 whether or not that plugin is loaded.  A fully qualified name is required if
3543 the plugin name does not begin with C<Catalyst::Plugin::>.
3544
3545  if ($c->registered_plugins('Some::Plugin')) {
3546      ...
3547  }
3548
3549 =cut
3550
3551 {
3552
3553     sub registered_plugins {
3554         my $proto = shift;
3555         return sort keys %{ $proto->_plugins } unless @_;
3556         my $plugin = shift;
3557         return 1 if exists $proto->_plugins->{$plugin};
3558         return exists $proto->_plugins->{"Catalyst::Plugin::$plugin"};
3559     }
3560
3561     sub _register_plugin {
3562         my ( $proto, $plugin, $instant ) = @_;
3563         my $class = ref $proto || $proto;
3564
3565         load_class( $plugin );
3566         $class->log->warn( "$plugin inherits from 'Catalyst::Component' - this is deprecated and will not work in 5.81" )
3567             if $plugin->isa( 'Catalyst::Component' );
3568         my $plugin_meta = Moose::Meta::Class->create($plugin);
3569         if (!$plugin_meta->has_method('new')
3570             && ( $plugin->isa('Class::Accessor::Fast') || $plugin->isa('Class::Accessor') ) ) {
3571             $plugin_meta->add_method('new', Moose::Object->meta->get_method('new'))
3572         }
3573         if (!$instant && !$proto->_plugins->{$plugin}) {
3574             my $meta = Class::MOP::get_metaclass_by_name($class);
3575             $meta->superclasses($plugin, $meta->superclasses);
3576         }
3577         $proto->_plugins->{$plugin} = 1;
3578         return $class;
3579     }
3580
3581     sub _default_plugins { return qw() }
3582
3583     sub setup_plugins {
3584         my ( $class, $plugins ) = @_;
3585
3586         $class->_plugins( {} ) unless $class->_plugins;
3587         $plugins = [ grep {
3588             m/Unicode::Encoding/ ? do {
3589                 $class->log->warn(
3590                     'Unicode::Encoding plugin is auto-applied,'
3591                     . ' please remove this from your appclass'
3592                     . ' and make sure to define "encoding" config'
3593                 );
3594                 unless (exists $class->config->{'encoding'}) {
3595                   $class->config->{'encoding'} = 'UTF-8';
3596                 }
3597                 () }
3598                 : $_
3599         } @$plugins ];
3600         push @$plugins, $class->_default_plugins;
3601         $plugins = Data::OptList::mkopt($plugins || []);
3602
3603         my @plugins = map {
3604             [ Catalyst::Utils::resolve_namespace(
3605                   $class . '::Plugin',
3606                   'Catalyst::Plugin', $_->[0]
3607               ),
3608               $_->[1],
3609             ]
3610          } @{ $plugins };
3611
3612         for my $plugin ( reverse @plugins ) {
3613             load_class($plugin->[0], $plugin->[1]);
3614             my $meta = find_meta($plugin->[0]);
3615             next if $meta && $meta->isa('Moose::Meta::Role');
3616
3617             $class->_register_plugin($plugin->[0]);
3618         }
3619
3620         my @roles =
3621             map  { $_->[0]->name, $_->[1] }
3622             grep { blessed($_->[0]) && $_->[0]->isa('Moose::Meta::Role') }
3623             map  { [find_meta($_->[0]), $_->[1]] }
3624             @plugins;
3625
3626         Moose::Util::apply_all_roles(
3627             $class => @roles
3628         ) if @roles;
3629     }
3630 }
3631
3632 =head2 default_middleware
3633
3634 Returns a list of instantiated PSGI middleware objects which is the default
3635 middleware that is active for this application (taking any configuration
3636 options into account, excluding your custom added middleware via the C<psgi_middleware>
3637 configuration option).  You can override this method if you wish to change
3638 the default middleware (although do so at risk since some middleware is vital
3639 to application function.)
3640
3641 The current default middleware list is:
3642
3643       Catalyst::Middleware::Stash
3644       Plack::Middleware::HTTPExceptions
3645       Plack::Middleware::RemoveRedundantBody
3646       Plack::Middleware::FixMissingBodyInRedirect
3647       Plack::Middleware::ContentLength
3648       Plack::Middleware::MethodOverride
3649       Plack::Middleware::Head
3650
3651 If the configuration setting C<using_frontend_proxy> is true we add:
3652
3653       Plack::Middleware::ReverseProxy
3654
3655 If the configuration setting C<using_frontend_proxy_path> is true we add:
3656
3657       Plack::Middleware::ReverseProxyPath
3658
3659 But B<NOTE> that L<Plack::Middleware::ReverseProxyPath> is not a dependency of the
3660 L<Catalyst> distribution so if you want to use this option you should add it to
3661 your project distribution file.
3662
3663 These middlewares will be added at L</setup_middleware> during the
3664 L</setup> phase of application startup.
3665
3666 =cut
3667
3668 sub default_middleware {
3669     my $class = shift;
3670     my @mw = (
3671       Catalyst::Middleware::Stash->new,
3672       Plack::Middleware::HTTPExceptions->new,
3673       Plack::Middleware::RemoveRedundantBody->new,
3674       Plack::Middleware::FixMissingBodyInRedirect->new,
3675       Plack::Middleware::ContentLength->new,
3676       Plack::Middleware::MethodOverride->new,
3677       Plack::Middleware::Head->new);
3678
3679     if($class->config->{using_frontend_proxy}) {
3680         push @mw, Plack::Middleware::ReverseProxy->new;
3681     }
3682
3683     if($class->config->{using_frontend_proxy_path}) {
3684         if(Class::Load::try_load_class('Plack::Middleware::ReverseProxyPath')) {
3685             push @mw, Plack::Middleware::ReverseProxyPath->new;
3686         } else {
3687           $class->log->error("Cannot use configuration 'using_frontend_proxy_path' because 'Plack::Middleware::ReverseProxyPath' is not installed");
3688         }
3689     }
3690
3691     return @mw;
3692 }
3693
3694 =head2 registered_middlewares
3695
3696 Read only accessor that returns an array of all the middleware in the order
3697 that they were added (which is the REVERSE of the order they will be applied).
3698
3699 The values returned will be either instances of L<Plack::Middleware> or of a
3700 compatible interface, or a coderef, which is assumed to be inlined middleware
3701
3702 =head2 setup_middleware (?@middleware)
3703
3704 Read configuration information stored in configuration key C<psgi_middleware> or
3705 from passed @args.
3706
3707 See under L</CONFIGURATION> information regarding C<psgi_middleware> and how
3708 to use it to enable L<Plack::Middleware>
3709
3710 This method is automatically called during 'setup' of your application, so
3711 you really don't need to invoke it.  However you may do so if you find the idea
3712 of loading middleware via configuration weird :).  For example:
3713
3714     package MyApp;
3715
3716     use Catalyst;
3717
3718     __PACKAGE__->setup_middleware('Head');
3719     __PACKAGE__->setup;
3720
3721 When we read middleware definitions from configuration, we reverse the list
3722 which sounds odd but is likely how you expect it to work if you have prior
3723 experience with L<Plack::Builder> or if you previously used the plugin
3724 L<Catalyst::Plugin::EnableMiddleware> (which is now considered deprecated)
3725
3726 So basically your middleware handles an incoming request from the first
3727 registered middleware, down and handles the response from the last middleware
3728 up.
3729
3730 =cut
3731
3732 sub registered_middlewares {
3733     my $class = shift;
3734     if(my $middleware = $class->_psgi_middleware) {
3735         my @mw = ($class->default_middleware, @$middleware);
3736
3737         if($class->config->{using_frontend_proxy}) {
3738           push @mw, Plack::Middleware::ReverseProxy->new;
3739         }
3740
3741         return @mw;
3742     } else {
3743         die "You cannot call ->registered_middlewares until middleware has been setup";
3744     }
3745 }
3746
3747 sub setup_middleware {
3748     my $class = shift;
3749     my @middleware_definitions;
3750
3751     # If someone calls this method you can add middleware with args.  However if its
3752     # called without an arg we need to setup the configuration middleware.
3753     if(@_) {
3754       @middleware_definitions = reverse(@_);
3755     } else {
3756       @middleware_definitions = reverse(@{$class->config->{'psgi_middleware'}||[]})
3757         unless $class->finalized_default_middleware;
3758       $class->finalized_default_middleware(1); # Only do this once, just in case some people call setup over and over...
3759     }
3760
3761     my @middleware = ();
3762     while(my $next = shift(@middleware_definitions)) {
3763         if(ref $next) {
3764             if(Scalar::Util::blessed $next && $next->can('wrap')) {
3765                 push @middleware, $next;
3766             } elsif(ref $next eq 'CODE') {
3767                 push @middleware, $next;
3768             } elsif(ref $next eq 'HASH') {
3769                 my $namespace = shift @middleware_definitions;
3770                 my $mw = $class->Catalyst::Utils::build_middleware($namespace, %$next);
3771                 push @middleware, $mw;
3772             } else {
3773               die "I can't handle middleware definition ${\ref $next}";
3774             }
3775         } else {
3776           my $mw = $class->Catalyst::Utils::build_middleware($next);
3777           push @middleware, $mw;
3778         }
3779     }
3780
3781     my @existing = @{$class->_psgi_middleware || []};
3782     $class->_psgi_middleware([@middleware,@existing,]);
3783 }
3784
3785 =head2 registered_data_handlers
3786
3787 A read only copy of registered Data Handlers returned as a Hash, where each key
3788 is a content type and each value is a subref that attempts to decode that content
3789 type.
3790
3791 =head2 setup_data_handlers (?@data_handler)
3792
3793 Read configuration information stored in configuration key C<data_handlers> or
3794 from passed @args.
3795
3796 See under L</CONFIGURATION> information regarding C<data_handlers>.
3797
3798 This method is automatically called during 'setup' of your application, so
3799 you really don't need to invoke it.
3800
3801 =head2 default_data_handlers
3802
3803 Default Data Handlers that come bundled with L<Catalyst>.  Currently there are
3804 only two default data handlers, for 'application/json' and an alternative to
3805 'application/x-www-form-urlencoded' which supposed nested form parameters via
3806 L<CGI::Struct> or via L<CGI::Struct::XS> IF you've installed it.
3807
3808 The 'application/json' data handler is used to parse incoming JSON into a Perl
3809 data structure.  It used either L<JSON::MaybeXS> or L<JSON>, depending on which
3810 is installed.  This allows you to fail back to L<JSON:PP>, which is a Pure Perl
3811 JSON decoder, and has the smallest dependency impact.
3812
3813 Because we don't wish to add more dependencies to L<Catalyst>, if you wish to
3814 use this new feature we recommend installing L<JSON> or L<JSON::MaybeXS> in
3815 order to get the best performance.  You should add either to your dependency
3816 list (Makefile.PL, dist.ini, cpanfile, etc.)
3817
3818 =cut
3819
3820 sub registered_data_handlers {
3821     my $class = shift;
3822     if(my $data_handlers = $class->_data_handlers) {
3823         return %$data_handlers;
3824     } else {
3825         $class->setup_data_handlers;
3826         return $class->registered_data_handlers;
3827     }
3828 }
3829
3830 sub setup_data_handlers {
3831     my ($class, %data_handler_callbacks) = @_;
3832     %data_handler_callbacks = (
3833       %{$class->default_data_handlers},
3834       %{$class->config->{'data_handlers'}||+{}},
3835       %data_handler_callbacks);
3836
3837     $class->_data_handlers(\%data_handler_callbacks);
3838 }
3839
3840 sub default_data_handlers {
3841     my ($class) = @_;
3842     return +{
3843       'application/x-www-form-urlencoded' => sub {
3844           my ($fh, $req) = @_;
3845           my $params = $req->_use_hash_multivalue ? $req->body_parameters->mixed : $req->body_parameters;
3846           Class::Load::load_first_existing_class('CGI::Struct::XS', 'CGI::Struct')
3847             ->can('build_cgi_struct')->($params);
3848       },
3849       'application/json' => sub {
3850           my ($fh, $req) = @_;
3851           my $parser = Class::Load::load_first_existing_class('JSON::MaybeXS', 'JSON');
3852           my $slurped;
3853           return eval { 
3854             local $/;
3855             $slurped = $fh->getline;
3856             $parser->can("decode_json")->($slurped); # decode_json does utf8 decoding for us
3857           } || Catalyst::Exception->throw(sprintf "Error Parsing POST '%s', Error: %s", (defined($slurped) ? $slurped : 'undef') ,$@);
3858         },
3859     };
3860 }
3861
3862 sub _handle_http_exception {
3863     my ( $self, $error ) = @_;
3864     if (
3865            !$self->config->{always_catch_http_exceptions}
3866         && blessed $error
3867         && (
3868             $error->can('as_psgi')
3869             || (   $error->can('code')
3870                 && $error->code =~ m/^[1-5][0-9][0-9]$/ )
3871         )
3872       )
3873     {
3874         return 1;
3875     }
3876 }
3877
3878 =head2 $c->stack
3879
3880 Returns an arrayref of the internal execution stack (actions that are
3881 currently executing).
3882
3883 =head2 $c->stats
3884
3885 Returns the current timing statistics object. By default Catalyst uses
3886 L<Catalyst::Stats|Catalyst::Stats>, but can be set otherwise with
3887 L<< stats_class|/"$c->stats_class" >>.
3888
3889 Even if L<< -Stats|/"-Stats" >> is not enabled, the stats object is still
3890 available. By enabling it with C< $c->stats->enabled(1) >, it can be used to
3891 profile explicitly, although MyApp.pm still won't profile nor output anything
3892 by itself.
3893
3894 =head2 $c->stats_class
3895
3896 Returns or sets the stats (timing statistics) class. L<Catalyst::Stats|Catalyst::Stats> is used by default.
3897
3898 =head2 $app->stats_class_traits
3899
3900 A arrayref of L<Moose::Role>s that are applied to the stats_class before creating it.
3901
3902 =head2 $app->composed_stats_class
3903
3904 this is the stats_class composed with any 'stats_class_traits'.
3905
3906 =head2 $c->use_stats
3907
3908 Returns 1 when L<< stats collection|/"-Stats" >> is enabled.
3909
3910 Note that this is a static method, not an accessor and should be overridden
3911 by declaring C<sub use_stats { 1 }> in your MyApp.pm, not by calling C<< $c->use_stats(1) >>.
3912
3913 =cut
3914
3915 sub use_stats { 0 }
3916
3917
3918 =head2 $c->write( $data )
3919
3920 Writes $data to the output stream. When using this method directly, you
3921 will need to manually set the C<Content-Length> header to the length of
3922 your output data, if known.
3923
3924 =cut
3925
3926 sub write {
3927     my $c = shift;
3928
3929     # Finalize headers if someone manually writes output (for compat)
3930     $c->finalize_headers;
3931
3932     return $c->response->write( @_ );
3933 }
3934
3935 =head2 version
3936
3937 Returns the Catalyst version number. Mostly useful for "powered by"
3938 messages in template systems.
3939
3940 =cut
3941
3942 sub version { return $Catalyst::VERSION }
3943
3944 =head1 CONFIGURATION
3945
3946 There are a number of 'base' config variables which can be set:
3947
3948 =over
3949
3950 =item *
3951
3952 C<always_catch_http_exceptions> - As of version 5.90060 Catalyst
3953 rethrows errors conforming to the interface described by
3954 L<Plack::Middleware::HTTPExceptions> and lets the middleware deal with it.
3955 Set true to get the deprecated behaviour and have Catalyst catch HTTP exceptions.
3956
3957 =item *
3958
3959 C<default_model> - The default model picked if you say C<< $c->model >>. See L<< /$c->model($name) >>.
3960
3961 =item *
3962
3963 C<default_view> - The default view to be rendered or returned when C<< $c->view >> is called. See L<< /$c->view($name) >>.
3964
3965 =item *
3966
3967 C<disable_component_resolution_regex_fallback> - Turns
3968 off the deprecated component resolution functionality so
3969 that if any of the component methods (e.g. C<< $c->controller('Foo') >>)
3970 are called then regex search will not be attempted on string values and
3971 instead C<undef> will be returned.
3972
3973 =item *
3974
3975 C<home> - The application home directory. In an uninstalled application,
3976 this is the top level application directory. In an installed application,
3977 this will be the directory containing C<< MyApp.pm >>.
3978
3979 =item *
3980
3981 C<ignore_frontend_proxy> - See L</PROXY SUPPORT>
3982
3983 =item *
3984
3985 C<name> - The name of the application in debug messages and the debug and
3986 welcome screens
3987
3988 =item *
3989
3990 C<parse_on_demand> - The request body (for example file uploads) will not be parsed
3991 until it is accessed. This allows you to (for example) check authentication (and reject
3992 the upload) before actually receiving all the data. See L</ON-DEMAND PARSER>
3993
3994 =item *
3995
3996 C<root> - The root directory for templates. Usually this is just a
3997 subdirectory of the home directory, but you can set it to change the
3998 templates to a different directory.
3999
4000 =item *
4001
4002 C<search_extra> - Array reference passed to Module::Pluggable to for additional
4003 namespaces from which components will be loaded (and constructed and stored in
4004 C<< $c->components >>).
4005
4006 =item *
4007
4008 C<show_internal_actions> - If true, causes internal actions such as C<< _DISPATCH >>
4009 to be shown in hit debug tables in the test server.
4010
4011 =item *
4012
4013 C<use_request_uri_for_path> - Controls if the C<REQUEST_URI> or C<PATH_INFO> environment
4014 variable should be used for determining the request path.
4015
4016 Most web server environments pass the requested path to the application using environment variables,
4017 from which Catalyst has to reconstruct the request base (i.e. the top level path to / in the application,
4018 exposed as C<< $c->request->base >>) and the request path below that base.
4019
4020 There are two methods of doing this, both of which have advantages and disadvantages. Which method is used
4021 is determined by the C<< $c->config(use_request_uri_for_path) >> setting (which can either be true or false).
4022
4023 =over
4024
4025 =item use_request_uri_for_path => 0
4026
4027 This is the default (and the) traditional method that Catalyst has used for determining the path information.
4028 The path is generated from a combination of the C<PATH_INFO> and C<SCRIPT_NAME> environment variables.
4029 The allows the application to behave correctly when C<mod_rewrite> is being used to redirect requests
4030 into the application, as these variables are adjusted by mod_rewrite to take account for the redirect.
4031
4032 However this method has the major disadvantage that it is impossible to correctly decode some elements
4033 of the path, as RFC 3875 says: "C<< Unlike a URI path, the PATH_INFO is not URL-encoded, and cannot
4034 contain path-segment parameters. >>" This means PATH_INFO is B<always> decoded, and therefore Catalyst
4035 can't distinguish / vs %2F in paths (in addition to other encoded values).
4036
4037 =item use_request_uri_for_path => 1
4038
4039 This method uses the C<REQUEST_URI> and C<SCRIPT_NAME> environment variables. As C<REQUEST_URI> is never
4040 decoded, this means that applications using this mode can correctly handle URIs including the %2F character
4041 (i.e. with C<AllowEncodedSlashes> set to C<On> in Apache).
4042
4043 Given that this method of path resolution is provably more correct, it is recommended that you use
4044 this unless you have a specific need to deploy your application in a non-standard environment, and you are
4045 aware of the implications of not being able to handle encoded URI paths correctly.
4046
4047 However it also means that in a number of cases when the app isn't installed directly at a path, but instead
4048 is having paths rewritten into it (e.g. as a .cgi/fcgi in a public_html directory, with mod_rewrite in a
4049 .htaccess file, or when SSI is used to rewrite pages into the app, or when sub-paths of the app are exposed
4050 at other URIs than that which the app is 'normally' based at with C<mod_rewrite>), the resolution of
4051 C<< $c->request->base >> will be incorrect.
4052
4053 =back
4054
4055 =item *
4056
4057 C<using_frontend_proxy> - See L</PROXY SUPPORT>.
4058
4059 =item *
4060
4061 C<using_frontend_proxy_path> - Enabled L<Plack::Middleware::ReverseProxyPath> on your application (if
4062 installed, otherwise log an error).  This is useful if your application is not running on the
4063 'root' (or /) of your host server.  B<NOTE> if you use this feature you should add the required
4064 middleware to your project dependency list since its not automatically a dependency of L<Catalyst>.
4065 This has been done since not all people need this feature and we wish to restrict the growth of
4066 L<Catalyst> dependencies.
4067
4068 =item *
4069
4070 C<encoding> - See L</ENCODING>
4071
4072 This now defaults to 'UTF-8'.  You my turn it off by setting this configuration
4073 value to undef.
4074
4075 =item *
4076
4077 C<abort_chain_on_error_fix>
4078
4079 When there is an error in an action chain, the default behavior is to continue
4080 processing the remaining actions and then catch the error upon chain end.  This
4081 can lead to running actions when the application is in an unexpected state.  If
4082 you have this issue, setting this config value to true will promptly exit a
4083 chain when there is an error raised in any action (thus terminating the chain
4084 early.)
4085
4086 use like:
4087
4088     __PACKAGE__->config(abort_chain_on_error_fix => 1);
4089
4090 In the future this might become the default behavior.
4091
4092 =item *
4093
4094 C<use_hash_multivalue_in_request>
4095
4096 In L<Catalyst::Request> the methods C<query_parameters>, C<body_parametes>
4097 and C<parameters> return a hashref where values might be scalar or an arrayref
4098 depending on the incoming data.  In many cases this can be undesirable as it
4099 leads one to writing defensive code like the following:
4100
4101     my ($val) = ref($c->req->parameters->{a}) ?
4102       @{$c->req->parameters->{a}} :
4103         $c->req->parameters->{a};
4104
4105 Setting this configuration item to true will make L<Catalyst> populate the
4106 attributes underlying these methods with an instance of L<Hash::MultiValue>
4107 which is used by L<Plack::Request> and others to solve this very issue.  You
4108 may prefer this behavior to the default, if so enable this option (be warned
4109 if you enable it in a legacy application we are not sure if it is completely
4110 backwardly compatible).
4111
4112 =item *
4113
4114 C<skip_complex_post_part_handling>
4115
4116 When creating body parameters from a POST, if we run into a multpart POST
4117 that does not contain uploads, but instead contains inlined complex data
4118 (very uncommon) we cannot reliably convert that into field => value pairs.  So
4119 instead we create an instance of L<Catalyst::Request::PartData>.  If this causes
4120 issue for you, you can disable this by setting C<skip_complex_post_part_handling>
4121 to true (default is false).  
4122
4123 =item *
4124
4125 C<skip_body_param_unicode_decoding>
4126
4127 Generally we decode incoming POST params based on your declared encoding (the
4128 default for this is to decode UTF-8).  If this is causing you trouble and you
4129 do not wish to turn all encoding support off (with the C<encoding> configuration
4130 parameter) you may disable this step atomically by setting this configuration
4131 parameter to true.
4132
4133 =item *
4134
4135 C<do_not_decode_query>
4136
4137 If true, then do not try to character decode any wide characters in your
4138 request URL query or keywords.  Most readings of the relevent specifications
4139 suggest these should be UTF-* encoded, which is the default that L<Catalyst>
4140 will use, hwoever if you are creating a lot of URLs manually or have external
4141 evil clients, this might cause you trouble.  If you find the changes introduced
4142 in Catalyst version 5.90080+ break some of your query code, you may disable 
4143 the UTF-8 decoding globally using this configuration.
4144
4145 This setting takes precedence over C<default_query_encoding> and
4146 C<decode_query_using_global_encoding>
4147
4148 =item *
4149
4150 C<default_query_encoding>
4151
4152 By default we decode query and keywords in your request URL using UTF-8, which
4153 is our reading of the relevent specifications.  This setting allows one to
4154 specify a fixed value for how to decode your query.  You might need this if
4155 you are doing a lot of custom encoding of your URLs and not using UTF-8.
4156
4157 This setting take precedence over C<decode_query_using_global_encoding>.
4158
4159 =item *
4160
4161 C<decode_query_using_global_encoding>
4162
4163 Setting this to true will default your query decoding to whatever your
4164 general global encoding is (the default is UTF-8).
4165
4166 =item *
4167
4168 C<use_chained_args_0_special_case>
4169
4170 In older versions of Catalyst, when more than one action matched the same path
4171 AND all those matching actions declared Args(0), we'd break the tie by choosing
4172 the first action defined.  We now normalized how Args(0) works so that it
4173 follows the same rule as Args(N), which is to say when we need to break a tie
4174 we choose the LAST action defined.  If this breaks your code and you don't
4175 have time to update to follow the new normalized approach, you may set this
4176 value to true and it will globally revert to the original chaining behavior.
4177
4178 =item *
4179
4180 C<psgi_middleware> - See L<PSGI MIDDLEWARE>.
4181
4182 =item *
4183
4184 C<data_handlers> - See L<DATA HANDLERS>.
4185
4186 =item *
4187
4188 C<stats_class_traits>
4189
4190 An arrayref of L<Moose::Role>s that get componsed into your stats class.
4191
4192 =item *
4193
4194 C<request_class_traits>
4195
4196 An arrayref of L<Moose::Role>s that get componsed into your request class.
4197
4198 =item *
4199
4200 C<response_class_traits>
4201
4202 An arrayref of L<Moose::Role>s that get componsed into your response class.
4203
4204 =item *
4205
4206 C<inject_components>
4207
4208 A Hashref of L<Catalyst::Component> subclasses that are 'injected' into configuration.
4209 For example:
4210
4211     MyApp->config({
4212       inject_components => {
4213         'Controller::Err' => { from_component => 'Local::Controller::Errors' },
4214         'Model::Zoo' => { from_component => 'Local::Model::Foo' },
4215         'Model::Foo' => { from_component => 'Local::Model::Foo', roles => ['TestRole'] },
4216       },
4217       'Controller::Err' => { a => 100, b=>200, namespace=>'error' },
4218       'Model::Zoo' => { a => 2 },
4219       'Model::Foo' => { a => 100 },
4220     });
4221
4222 Generally L<Catalyst> looks for components in your Model/View or Controller directories.
4223 However for cases when you which to use an existing component and you don't need any
4224 customization (where for when you can apply a role to customize it) you may inject those
4225 components into your application.  Please note any configuration should be done 'in the
4226 normal way', with a key under configuration named after the component affix, as in the
4227 above example.
4228
4229 Using this type of injection allows you to construct significant amounts of your application
4230 with only configuration!.  This may or may not lead to increased code understanding.
4231
4232 Please not you may also call the ->inject_components application method as well, although
4233 you must do so BEFORE setup.
4234
4235 =back
4236
4237 =head1 EXCEPTIONS
4238
4239 Generally when you throw an exception inside an Action (or somewhere in
4240 your stack, such as in a model that an Action is calling) that exception
4241 is caught by Catalyst and unless you either catch it yourself (via eval
4242 or something like L<Try::Tiny> or by reviewing the L</error> stack, it
4243 will eventually reach L</finalize_errors> and return either the debugging
4244 error stack page, or the default error page.  However, if your exception
4245 can be caught by L<Plack::Middleware::HTTPExceptions>, L<Catalyst> will
4246 instead rethrow it so that it can be handled by that middleware (which
4247 is part of the default middleware).  For example this would allow
4248
4249     use HTTP::Throwable::Factory 'http_throw';
4250
4251     sub throws_exception :Local {
4252       my ($self, $c) = @_;
4253
4254       http_throw(SeeOther => { location =>
4255         $c->uri_for($self->action_for('redirect')) });
4256
4257     }
4258
4259 =head1 INTERNAL ACTIONS
4260
4261 Catalyst uses internal actions like C<_DISPATCH>, C<_BEGIN>, C<_AUTO>,
4262 C<_ACTION>, and C<_END>. These are by default not shown in the private
4263 action table, but you can make them visible with a config parameter.
4264
4265     MyApp->config(show_internal_actions => 1);
4266
4267 =head1 ON-DEMAND PARSER
4268
4269 The request body is usually parsed at the beginning of a request,
4270 but if you want to handle input yourself, you can enable on-demand
4271 parsing with a config parameter.
4272
4273     MyApp->config(parse_on_demand => 1);
4274
4275 =head1 PROXY SUPPORT
4276
4277 Many production servers operate using the common double-server approach,
4278 with a lightweight frontend web server passing requests to a larger
4279 backend server. An application running on the backend server must deal
4280 with two problems: the remote user always appears to be C<127.0.0.1> and
4281 the server's hostname will appear to be C<localhost> regardless of the
4282 virtual host that the user connected through.
4283
4284 Catalyst will automatically detect this situation when you are running
4285 the frontend and backend servers on the same machine. The following
4286 changes are made to the request.
4287
4288     $c->req->address is set to the user's real IP address, as read from
4289     the HTTP X-Forwarded-For header.
4290
4291     The host value for $c->req->base and $c->req->uri is set to the real
4292     host, as read from the HTTP X-Forwarded-Host header.
4293
4294 Additionally, you may be running your backend application on an insecure
4295 connection (port 80) while your frontend proxy is running under SSL.  If there
4296 is a discrepancy in the ports, use the HTTP header C<X-Forwarded-Port> to
4297 tell Catalyst what port the frontend listens on.  This will allow all URIs to
4298 be created properly.
4299
4300 In the case of passing in:
4301
4302     X-Forwarded-Port: 443
4303
4304 All calls to C<uri_for> will result in an https link, as is expected.
4305
4306 Obviously, your web server must support these headers for this to work.
4307
4308 In a more complex server farm environment where you may have your
4309 frontend proxy server(s) on different machines, you will need to set a
4310 configuration option to tell Catalyst to read the proxied data from the
4311 headers.
4312
4313     MyApp->config(using_frontend_proxy => 1);
4314
4315 If you do not wish to use the proxy support at all, you may set:
4316
4317     MyApp->config(ignore_frontend_proxy => 0);
4318
4319 =head2 Note about psgi files
4320
4321 Note that if you supply your own .psgi file, calling
4322 C<< MyApp->psgi_app(@_); >>, then B<this will not happen automatically>.
4323
4324 You either need to apply L<Plack::Middleware::ReverseProxy> yourself
4325 in your psgi, for example:
4326
4327     builder {
4328         enable "Plack::Middleware::ReverseProxy";
4329         MyApp->psgi_app
4330     };
4331
4332 This will unconditionally add the ReverseProxy support, or you need to call
4333 C<< $app = MyApp->apply_default_middlewares($app) >> (to conditionally
4334 apply the support depending upon your config).
4335
4336 See L<Catalyst::PSGI> for more information.
4337
4338 =head1 THREAD SAFETY
4339
4340 Catalyst has been tested under Apache 2's threading C<mpm_worker>,
4341 C<mpm_winnt>, and the standalone forking HTTP server on Windows. We
4342 believe the Catalyst core to be thread-safe.
4343
4344 If you plan to operate in a threaded environment, remember that all other
4345 modules you are using must also be thread-safe. Some modules, most notably
4346 L<DBD::SQLite>, are not thread-safe.
4347
4348 =head1 DATA HANDLERS
4349
4350 The L<Catalyst::Request> object uses L<HTTP::Body> to populate 'classic' HTML
4351 form parameters and URL search query fields.  However it has become common
4352 for various alternative content types to be PUT or POSTed to your controllers
4353 and actions.  People working on RESTful APIs, or using AJAX often use JSON,
4354 XML and other content types when communicating with an application server.  In
4355 order to better support this use case, L<Catalyst> defines a global configuration
4356 option, C<data_handlers>, which lets you associate a content type with a coderef
4357 that parses that content type into something Perl can readily access.
4358
4359     package MyApp::Web;
4360  
4361     use Catalyst;
4362     use JSON::Maybe;
4363  
4364     __PACKAGE__->config(
4365       data_handlers => {
4366         'application/json' => sub { local $/; decode_json $_->getline },
4367       },
4368       ## Any other configuration.
4369     );
4370  
4371     __PACKAGE__->setup;
4372
4373 By default L<Catalyst> comes with a generic JSON data handler similar to the
4374 example given above, which uses L<JSON::Maybe> to provide either L<JSON::PP>
4375 (a pure Perl, dependency free JSON parser) or L<Cpanel::JSON::XS> if you have
4376 it installed (if you want the faster XS parser, add it to you project Makefile.PL
4377 or dist.ini, cpanfile, etc.)
4378
4379 The C<data_handlers> configuration is a hashref whose keys are HTTP Content-Types
4380 (matched against the incoming request type using a regexp such as to be case
4381 insensitive) and whose values are coderefs that receive a localized version of
4382 C<$_> which is a filehandle object pointing to received body.
4383
4384 This feature is considered an early access release and we reserve the right
4385 to alter the interface in order to provide a performant and secure solution to
4386 alternative request body content.  Your reports welcomed!
4387
4388 =head1 PSGI MIDDLEWARE
4389
4390 You can define middleware, defined as L<Plack::Middleware> or a compatible
4391 interface in configuration.  Your middleware definitions are in the form of an
4392 arrayref under the configuration key C<psgi_middleware>.  Here's an example
4393 with details to follow:
4394
4395     package MyApp::Web;
4396  
4397     use Catalyst;
4398     use Plack::Middleware::StackTrace;
4399  
4400     my $stacktrace_middleware = Plack::Middleware::StackTrace->new;
4401  
4402     __PACKAGE__->config(
4403       'psgi_middleware', [
4404         'Debug',
4405         '+MyApp::Custom',
4406         $stacktrace_middleware,
4407         'Session' => {store => 'File'},
4408         sub {
4409           my $app = shift;
4410           return sub {
4411             my $env = shift;
4412             $env->{myapp.customkey} = 'helloworld';
4413             $app->($env);
4414           },
4415         },
4416       ],
4417     );
4418  
4419     __PACKAGE__->setup;
4420
4421 So the general form is:
4422
4423     __PACKAGE__->config(psgi_middleware => \@middleware_definitions);
4424
4425 Where C<@middleware> is one or more of the following, applied in the REVERSE of
4426 the order listed (to make it function similarly to L<Plack::Builder>:
4427
4428 Alternatively, you may also define middleware by calling the L</setup_middleware>
4429 package method:
4430
4431     package MyApp::Web;
4432
4433     use Catalyst;
4434
4435     __PACKAGE__->setup_middleware( \@middleware_definitions);
4436     __PACKAGE__->setup;
4437
4438 In the case where you do both (use 'setup_middleware' and configuration) the
4439 package call to setup_middleware will be applied earlier (in other words its
4440 middleware will wrap closer to the application).  Keep this in mind since in
4441 some cases the order of middleware is important.
4442
4443 The two approaches are not exclusive.
4444  
4445 =over 4
4446  
4447 =item Middleware Object
4448  
4449 An already initialized object that conforms to the L<Plack::Middleware>
4450 specification:
4451  
4452     my $stacktrace_middleware = Plack::Middleware::StackTrace->new;
4453  
4454     __PACKAGE__->config(
4455       'psgi_middleware', [
4456         $stacktrace_middleware,
4457       ]);
4458  
4459  
4460 =item coderef
4461  
4462 A coderef that is an inlined middleware:
4463  
4464     __PACKAGE__->config(
4465       'psgi_middleware', [
4466         sub {
4467           my $app = shift;
4468           return sub {
4469             my $env = shift;
4470             if($env->{PATH_INFO} =~m/forced/) {
4471               Plack::App::File
4472                 ->new(file=>TestApp->path_to(qw/share static forced.txt/))
4473                 ->call($env);
4474             } else {
4475               return $app->($env);
4476             }
4477          },
4478       },
4479     ]);
4480  
4481  
4482  
4483 =item a scalar
4484  
4485 We assume the scalar refers to a namespace after normalizing it using the
4486 following rules:
4487
4488 (1) If the scalar is prefixed with a "+" (as in C<+MyApp::Foo>) then the full string
4489 is assumed to be 'as is', and we just install and use the middleware.
4490
4491 (2) If the scalar begins with "Plack::Middleware" or your application namespace
4492 (the package name of your Catalyst application subclass), we also assume then
4493 that it is a full namespace, and use it.
4494
4495 (3) Lastly, we then assume that the scalar is a partial namespace, and attempt to
4496 resolve it first by looking for it under your application namespace (for example
4497 if you application is "MyApp::Web" and the scalar is "MyMiddleware", we'd look
4498 under "MyApp::Web::Middleware::MyMiddleware") and if we don't find it there, we
4499 will then look under the regular L<Plack::Middleware> namespace (i.e. for the
4500 previous we'd try "Plack::Middleware::MyMiddleware").  We look under your application
4501 namespace first to let you 'override' common L<Plack::Middleware> locally, should
4502 you find that a good idea.
4503
4504 Examples:
4505
4506     package MyApp::Web;
4507
4508     __PACKAGE__->config(
4509       'psgi_middleware', [
4510         'Debug',  ## MyAppWeb::Middleware::Debug->wrap or Plack::Middleware::Debug->wrap
4511         'Plack::Middleware::Stacktrace', ## Plack::Middleware::Stacktrace->wrap
4512         '+MyApp::Custom',  ## MyApp::Custom->wrap
4513       ],
4514     );
4515  
4516 =item a scalar followed by a hashref
4517  
4518 Just like the previous, except the following C<HashRef> is used as arguments
4519 to initialize the middleware object.
4520  
4521     __PACKAGE__->config(
4522       'psgi_middleware', [
4523          'Session' => {store => 'File'},
4524     ]);
4525
4526 =back
4527
4528 Please see L<PSGI> for more on middleware.
4529
4530 =head1 ENCODING
4531
4532 Starting in L<Catalyst> version 5.90080 encoding is automatically enabled
4533 and set to encode all body responses to UTF8 when possible and applicable.
4534 Following is documentation on this process.  If you are using an older
4535 version of L<Catalyst> you should review documentation for that version since
4536 a lot has changed.
4537
4538 By default encoding is now 'UTF-8'.  You may turn it off by setting
4539 the encoding configuration to undef.
4540
4541     MyApp->config(encoding => undef);
4542
4543 This is recommended for temporary backwards compatibility only.
4544
4545 Encoding is automatically applied when the content-type is set to
4546 a type that can be encoded.  Currently we encode when the content type
4547 matches the following regular expression:
4548
4549     $content_type =~ /^text|xml$|javascript$/
4550
4551 Encoding is set on the application, but it is copied to the context object
4552 so that you can override it on a request basis.
4553
4554 Be default we don't automatically encode 'application/json' since the most
4555 common approaches to generating this type of response (Either via L<Catalyst::View::JSON>
4556 or L<Catalyst::Action::REST>) will do so already and we want to avoid double
4557 encoding issues.
4558
4559 If you are producing JSON response in an unconventional manner (such
4560 as via a template or manual strings) you should perform the UTF8 encoding
4561 manually as well such as to conform to the JSON specification.
4562
4563 NOTE: We also examine the value of $c->response->content_encoding.  If
4564 you set this (like for example 'gzip', and manually gzipping the body)
4565 we assume that you have done all the necessary encoding yourself, since
4566 we cannot encode the gzipped contents.  If you use a plugin like
4567 L<Catalyst::Plugin::Compress> you need to update to a modern version in order
4568 to have this function correctly  with the new UTF8 encoding code, or you
4569 can use L<Plack::Middleware::Deflater> or (probably best) do your compression on
4570 a front end proxy.
4571
4572 =head2 Methods
4573
4574 =over 4
4575
4576 =item encoding
4577
4578 Returns an instance of an C<Encode> encoding
4579
4580     print $c->encoding->name
4581
4582 =item handle_unicode_encoding_exception ($exception_context)
4583
4584 Method called when decoding process for a request fails.
4585
4586 An C<$exception_context> hashref is provided to allow you to override the
4587 behaviour of your application when given data with incorrect encodings.
4588
4589 The default method throws exceptions in the case of invalid request parameters
4590 (resulting in a 500 error), but ignores errors in upload filenames.
4591
4592 The keys passed in the C<$exception_context> hash are:
4593
4594 =over
4595
4596 =item param_value
4597
4598 The value which was not able to be decoded.
4599
4600 =item error_msg
4601
4602 The exception received from L<Encode>.
4603
4604 =item encoding_step
4605
4606 What type of data was being decoded. Valid values are (currently)
4607 C<params> - for request parameters / arguments / captures
4608 and C<uploads> - for request upload filenames.
4609
4610 =back
4611
4612 =back
4613
4614 =head1 SUPPORT
4615
4616 IRC:
4617
4618     Join #catalyst on irc.perl.org.
4619
4620 Mailing Lists:
4621
4622     http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
4623     http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst-dev
4624
4625 Web:
4626
4627     http://catalyst.perl.org
4628
4629 Wiki:
4630
4631     http://dev.catalyst.perl.org
4632
4633 =head1 SEE ALSO
4634
4635 =head2 L<Task::Catalyst> - All you need to start with Catalyst
4636
4637 =head2 L<Catalyst::Manual> - The Catalyst Manual
4638
4639 =head2 L<Catalyst::Component>, L<Catalyst::Controller> - Base classes for components
4640
4641 =head2 L<Catalyst::Engine> - Core engine
4642
4643 =head2 L<Catalyst::Log> - Log class.
4644
4645 =head2 L<Catalyst::Request> - Request object
4646
4647 =head2 L<Catalyst::Response> - Response object
4648
4649 =head2 L<Catalyst::Test> - The test suite.
4650
4651 =head1 PROJECT FOUNDER
4652
4653 sri: Sebastian Riedel <sri@cpan.org>
4654
4655 =head1 CONTRIBUTORS
4656
4657 abw: Andy Wardley
4658
4659 acme: Leon Brocard <leon@astray.com>
4660
4661 abraxxa: Alexander Hartmaier <abraxxa@cpan.org>
4662
4663 andrewalker: André Walker <andre@cpan.org>
4664
4665 Andrew Bramble
4666
4667 Andrew Ford E<lt>A.Ford@ford-mason.co.ukE<gt>
4668
4669 Andrew Ruthven
4670
4671 andyg: Andy Grundman <andy@hybridized.org>
4672
4673 audreyt: Audrey Tang
4674
4675 bricas: Brian Cassidy <bricas@cpan.org>
4676
4677 Caelum: Rafael Kitover <rkitover@io.com>
4678
4679 chansen: Christian Hansen
4680
4681 chicks: Christopher Hicks
4682
4683 Chisel Wright C<pause@herlpacker.co.uk>
4684
4685 Danijel Milicevic C<me@danijel.de>
4686
4687 davewood: David Schmidt <davewood@cpan.org>
4688
4689 David Kamholz E<lt>dkamholz@cpan.orgE<gt>
4690
4691 David Naughton, C<naughton@umn.edu>
4692
4693 David E. Wheeler
4694
4695 dhoss: Devin Austin <dhoss@cpan.org>
4696
4697 dkubb: Dan Kubb <dan.kubb-cpan@onautopilot.com>
4698
4699 Drew Taylor
4700
4701 dwc: Daniel Westermann-Clark <danieltwc@cpan.org>
4702
4703 esskar: Sascha Kiefer
4704
4705 fireartist: Carl Franks <cfranks@cpan.org>
4706
4707 frew: Arthur Axel "fREW" Schmidt <frioux@gmail.com>
4708
4709 gabb: Danijel Milicevic
4710
4711 Gary Ashton Jones
4712
4713 Gavin Henry C<ghenry@perl.me.uk>
4714
4715 Geoff Richards
4716
4717 groditi: Guillermo Roditi <groditi@gmail.com>
4718
4719 hobbs: Andrew Rodland <andrew@cleverdomain.org>
4720
4721 ilmari: Dagfinn Ilmari MannsÃ¥ker <ilmari@ilmari.org>
4722
4723 jcamacho: Juan Camacho
4724
4725 jester: Jesse Sheidlower C<jester@panix.com>
4726
4727 jhannah: Jay Hannah <jay@jays.net>
4728
4729 Jody Belka
4730
4731 Johan Lindstrom
4732
4733 jon: Jon Schutz <jjschutz@cpan.org>
4734
4735 Jonathan Rockway C<< <jrockway@cpan.org> >>
4736
4737 Kieren Diment C<kd@totaldatasolution.com>
4738
4739 konobi: Scott McWhirter <konobi@cpan.org>
4740
4741 marcus: Marcus Ramberg <mramberg@cpan.org>
4742
4743 miyagawa: Tatsuhiko Miyagawa <miyagawa@bulknews.net>
4744
4745 mgrimes: Mark Grimes <mgrimes@cpan.org>
4746
4747 mst: Matt S. Trout <mst@shadowcatsystems.co.uk>
4748
4749 mugwump: Sam Vilain
4750
4751 naughton: David Naughton
4752
4753 ningu: David Kamholz <dkamholz@cpan.org>
4754
4755 nothingmuch: Yuval Kogman <nothingmuch@woobling.org>
4756
4757 numa: Dan Sully <daniel@cpan.org>
4758
4759 obra: Jesse Vincent
4760
4761 Octavian Rasnita
4762
4763 omega: Andreas Marienborg
4764
4765 Oleg Kostyuk <cub.uanic@gmail.com>
4766
4767 phaylon: Robert Sedlacek <phaylon@dunkelheit.at>
4768
4769 rafl: Florian Ragwitz <rafl@debian.org>
4770
4771 random: Roland Lammel <lammel@cpan.org>
4772
4773 Robert Sedlacek C<< <rs@474.at> >>
4774
4775 SpiceMan: Marcel Montes
4776
4777 sky: Arthur Bergman
4778
4779 szbalint: Balint Szilakszi <szbalint@cpan.org>
4780
4781 t0m: Tomas Doran <bobtfish@bobtfish.net>
4782
4783 Ulf Edvinsson
4784
4785 vanstyn: Henry Van Styn <vanstyn@cpan.org>
4786
4787 Viljo Marrandi C<vilts@yahoo.com>
4788
4789 Will Hawes C<info@whawes.co.uk>
4790
4791 willert: Sebastian Willert <willert@cpan.org>
4792
4793 wreis: Wallace Reis <wreis@cpan.org>
4794
4795 Yuval Kogman, C<nothingmuch@woobling.org>
4796
4797 rainboxx: Matthias Dietrich, C<perl@rainboxx.de>
4798
4799 dd070: Dhaval Dhanani <dhaval070@gmail.com>
4800
4801 Upasana <me@upasana.me>
4802
4803 John Napiorkowski (jnap) <jjnapiork@cpan.org>
4804
4805 =head1 COPYRIGHT
4806
4807 Copyright (c) 2005-2015, the above named PROJECT FOUNDER and CONTRIBUTORS.
4808
4809 =head1 LICENSE
4810
4811 This library is free software. You can redistribute it and/or modify it under
4812 the same terms as Perl itself.
4813
4814 =cut
4815
4816 no Moose;
4817
4818 __PACKAGE__->meta->make_immutable;
4819
4820 1;