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