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