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