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