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