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