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