minor change to warning. docs + Changes
[catagits/Catalyst-Runtime.git] / lib / Catalyst.pm
1 package Catalyst;
2
3 use strict;
4 use base 'Catalyst::Component';
5 use bytes;
6 use Catalyst::Exception;
7 use Catalyst::Log;
8 use Catalyst::Request;
9 use Catalyst::Request::Upload;
10 use Catalyst::Response;
11 use Catalyst::Utils;
12 use Catalyst::Controller;
13 use Devel::InnerPackage ();
14 use File::stat;
15 use Module::Pluggable::Object ();
16 use NEXT;
17 use Text::SimpleTable ();
18 use Path::Class::Dir ();
19 use Path::Class::File ();
20 use Time::HiRes qw/gettimeofday tv_interval/;
21 use URI ();
22 use URI::http;
23 use URI::https;
24 use Scalar::Util qw/weaken blessed/;
25 use Tree::Simple qw/use_weak_refs/;
26 use Tree::Simple::Visitor::FindByUID;
27 use attributes;
28 use utf8;
29 use Carp qw/croak carp/;
30
31 BEGIN { require 5.008001; }
32
33 __PACKAGE__->mk_accessors(
34     qw/counter request response state action stack namespace stats/
35 );
36
37 sub depth { scalar @{ shift->stack || [] }; }
38
39 # Laziness++
40 *comp = \&component;
41 *req  = \&request;
42 *res  = \&response;
43
44 # For backwards compatibility
45 *finalize_output = \&finalize_body;
46
47 # For statistics
48 our $COUNT     = 1;
49 our $START     = time;
50 our $RECURSION = 1000;
51 our $DETACH    = "catalyst_detach\n";
52
53 __PACKAGE__->mk_classdata($_)
54   for qw/components arguments dispatcher engine log dispatcher_class
55   engine_class context_class request_class response_class stats_class 
56   setup_finished/;
57
58 __PACKAGE__->dispatcher_class('Catalyst::Dispatcher');
59 __PACKAGE__->engine_class('Catalyst::Engine::CGI');
60 __PACKAGE__->request_class('Catalyst::Request');
61 __PACKAGE__->response_class('Catalyst::Response');
62 __PACKAGE__->stats_class('Catalyst::Stats');
63
64 # Remember to update this in Catalyst::Runtime as well!
65
66 our $VERSION = '5.7014';
67
68 sub import {
69     my ( $class, @arguments ) = @_;
70
71     # We have to limit $class to Catalyst to avoid pushing Catalyst upon every
72     # callers @ISA.
73     return unless $class eq 'Catalyst';
74
75     my $caller = caller(0);
76
77     unless ( $caller->isa('Catalyst') ) {
78         no strict 'refs';
79         push @{"$caller\::ISA"}, $class, 'Catalyst::Controller';
80     }
81
82     $caller->arguments( [@arguments] );
83     $caller->setup_home;
84 }
85
86 =head1 NAME
87
88 Catalyst - The Elegant MVC Web Application Framework
89
90 =head1 SYNOPSIS
91
92 See the L<Catalyst::Manual> distribution for comprehensive
93 documentation and tutorials.
94
95     # Install Catalyst::Devel for helpers and other development tools
96     # use the helper to create a new application
97     catalyst.pl MyApp
98
99     # add models, views, controllers
100     script/myapp_create.pl model MyDatabase DBIC::Schema create=dynamic dbi:SQLite:/path/to/db
101     script/myapp_create.pl view MyTemplate TT
102     script/myapp_create.pl controller Search
103
104     # built in testserver -- use -r to restart automatically on changes
105     # --help to see all available options
106     script/myapp_server.pl
107
108     # command line testing interface
109     script/myapp_test.pl /yada
110
111     ### in lib/MyApp.pm
112     use Catalyst qw/-Debug/; # include plugins here as well
113     
114     ### In lib/MyApp/Controller/Root.pm (autocreated)
115     sub foo : Global { # called for /foo, /foo/1, /foo/1/2, etc.
116         my ( $self, $c, @args ) = @_; # args are qw/1 2/ for /foo/1/2
117         $c->stash->{template} = 'foo.tt'; # set the template
118         # lookup something from db -- stash vars are passed to TT
119         $c->stash->{data} = 
120           $c->model('Database::Foo')->search( { country => $args[0] } );
121         if ( $c->req->params->{bar} ) { # access GET or POST parameters
122             $c->forward( 'bar' ); # process another action
123             # do something else after forward returns            
124         }
125     }
126     
127     # The foo.tt TT template can use the stash data from the database
128     [% WHILE (item = data.next) %]
129         [% item.foo %]
130     [% END %]
131     
132     # called for /bar/of/soap, /bar/of/soap/10, etc.
133     sub bar : Path('/bar/of/soap') { ... }
134
135     # called for all actions, from the top-most controller downwards
136     sub auto : Private { 
137         my ( $self, $c ) = @_;
138         if ( !$c->user_exists ) { # Catalyst::Plugin::Authentication
139             $c->res->redirect( '/login' ); # require login
140             return 0; # abort request and go immediately to end()
141         }
142         return 1; # success; carry on to next action
143     }
144     
145     # called after all actions are finished
146     sub end : Private { 
147         my ( $self, $c ) = @_;
148         if ( scalar @{ $c->error } ) { ... } # handle errors
149         return if $c->res->body; # already have a response
150         $c->forward( 'MyApp::View::TT' ); # render template
151     }
152
153     ### in MyApp/Controller/Foo.pm
154     # called for /foo/bar
155     sub bar : Local { ... }
156     
157     # called for /blargle
158     sub blargle : Global { ... }
159     
160     # an index action matches /foo, but not /foo/1, etc.
161     sub index : Private { ... }
162     
163     ### in MyApp/Controller/Foo/Bar.pm
164     # called for /foo/bar/baz
165     sub baz : Local { ... }
166     
167     # first Root auto is called, then Foo auto, then this
168     sub auto : Private { ... }
169     
170     # powerful regular expression paths are also possible
171     sub details : Regex('^product/(\w+)/details$') {
172         my ( $self, $c ) = @_;
173         # extract the (\w+) from the URI
174         my $product = $c->req->captures->[0];
175     }
176
177 See L<Catalyst::Manual::Intro> for additional information.
178
179 =head1 DESCRIPTION
180
181 Catalyst is a modern framework for making web applications without the
182 pain usually associated with this process. This document is a reference
183 to the main Catalyst application. If you are a new user, we suggest you
184 start with L<Catalyst::Manual::Tutorial> or L<Catalyst::Manual::Intro>.
185
186 See L<Catalyst::Manual> for more documentation.
187
188 Catalyst plugins can be loaded by naming them as arguments to the "use
189 Catalyst" statement. Omit the C<Catalyst::Plugin::> prefix from the
190 plugin name, i.e., C<Catalyst::Plugin::My::Module> becomes
191 C<My::Module>.
192
193     use Catalyst qw/My::Module/;
194
195 If your plugin starts with a name other than C<Catalyst::Plugin::>, you can
196 fully qualify the name by using a unary plus:
197
198     use Catalyst qw/
199         My::Module
200         +Fully::Qualified::Plugin::Name
201     /;
202
203 Special flags like C<-Debug> and C<-Engine> can also be specified as
204 arguments when Catalyst is loaded:
205
206     use Catalyst qw/-Debug My::Module/;
207
208 The position of plugins and flags in the chain is important, because
209 they are loaded in the order in which they appear.
210
211 The following flags are supported:
212
213 =head2 -Debug
214
215 Enables debug output. You can also force this setting from the system
216 environment with CATALYST_DEBUG or <MYAPP>_DEBUG. The environment
217 settings override the application, with <MYAPP>_DEBUG having the highest
218 priority.
219
220 =head2 -Engine
221
222 Forces Catalyst to use a specific engine. Omit the
223 C<Catalyst::Engine::> prefix of the engine name, i.e.:
224
225     use Catalyst qw/-Engine=CGI/;
226
227 =head2 -Home
228
229 Forces Catalyst to use a specific home directory, e.g.:
230
231     use Catalyst qw[-Home=/usr/mst];
232
233 This can also be done in the shell environment by setting either the
234 C<CATALYST_HOME> environment variable or C<MYAPP_HOME>; where C<MYAPP>
235 is replaced with the uppercased name of your application, any "::" in
236 the name will be replaced with underscores, e.g. MyApp::Web should use
237 MYAPP_WEB_HOME. If both variables are set, the MYAPP_HOME one will be used.
238
239 =head2 -Log
240
241 Specifies log level.
242
243 =head2 -Stats
244
245 Enables statistics collection and reporting. You can also force this setting
246 from the system environment with CATALYST_STATS or <MYAPP>_STATS. The
247 environment settings override the application, with <MYAPP>_STATS having the
248 highest priority.
249
250 e.g. 
251
252    use Catalyst qw/-Stats=1/
253
254 =head1 METHODS
255
256 =head2 INFORMATION ABOUT THE CURRENT REQUEST
257
258 =head2 $c->action
259
260 Returns a L<Catalyst::Action> object for the current action, which
261 stringifies to the action name. See L<Catalyst::Action>.
262
263 =head2 $c->namespace
264
265 Returns the namespace of the current action, i.e., the URI prefix
266 corresponding to the controller of the current action. For example:
267
268     # in Controller::Foo::Bar
269     $c->namespace; # returns 'foo/bar';
270
271 =head2 $c->request
272
273 =head2 $c->req
274
275 Returns the current L<Catalyst::Request> object, giving access to
276 information about the current client request (including parameters,
277 cookies, HTTP headers, etc.). See L<Catalyst::Request>.
278
279 =head2 REQUEST FLOW HANDLING
280
281 =head2 $c->forward( $action [, \@arguments ] )
282
283 =head2 $c->forward( $class, $method, [, \@arguments ] )
284
285 Forwards processing to another action, by its private name. If you give a
286 class name but no method, C<process()> is called. You may also optionally
287 pass arguments in an arrayref. The action will receive the arguments in
288 C<@_> and C<< $c->req->args >>. Upon returning from the function,
289 C<< $c->req->args >> will be restored to the previous values.
290
291 Any data C<return>ed from the action forwarded to, will be returned by the
292 call to forward.
293
294     my $foodata = $c->forward('/foo');
295     $c->forward('index');
296     $c->forward(qw/MyApp::Model::DBIC::Foo do_stuff/);
297     $c->forward('MyApp::View::TT');
298
299 Note that forward implies an C<<eval { }>> around the call (actually
300 C<execute> does), thus de-fatalizing all 'dies' within the called
301 action. If you want C<die> to propagate you need to do something like:
302
303     $c->forward('foo');
304     die $c->error if $c->error;
305
306 Or make sure to always return true values from your actions and write
307 your code like this:
308
309     $c->forward('foo') || return;
310
311 =cut
312
313 sub forward { my $c = shift; $c->dispatcher->forward( $c, @_ ) }
314
315 =head2 $c->detach( $action [, \@arguments ] )
316
317 =head2 $c->detach( $class, $method, [, \@arguments ] )
318
319 =head2 $c->detach()
320
321 The same as C<forward>, but doesn't return to the previous action when 
322 processing is finished. 
323
324 When called with no arguments it escapes the processing chain entirely.
325
326 =cut
327
328 sub detach { my $c = shift; $c->dispatcher->detach( $c, @_ ) }
329
330 =head2 $c->response
331
332 =head2 $c->res
333
334 Returns the current L<Catalyst::Response> object, see there for details.
335
336 =head2 $c->stash
337
338 Returns a hashref to the stash, which may be used to store data and pass
339 it between components during a request. You can also set hash keys by
340 passing arguments. The stash is automatically sent to the view. The
341 stash is cleared at the end of a request; it cannot be used for
342 persistent storage (for this you must use a session; see
343 L<Catalyst::Plugin::Session> for a complete system integrated with
344 Catalyst).
345
346     $c->stash->{foo} = $bar;
347     $c->stash( { moose => 'majestic', qux => 0 } );
348     $c->stash( bar => 1, gorch => 2 ); # equivalent to passing a hashref
349     
350     # stash is automatically passed to the view for use in a template
351     $c->forward( 'MyApp::View::TT' );
352
353 =cut
354
355 sub stash {
356     my $c = shift;
357     if (@_) {
358         my $stash = @_ > 1 ? {@_} : $_[0];
359         croak('stash takes a hash or hashref') unless ref $stash;
360         foreach my $key ( keys %$stash ) {
361             $c->{stash}->{$key} = $stash->{$key};
362         }
363     }
364     return $c->{stash};
365 }
366
367 =head2 $c->error
368
369 =head2 $c->error($error, ...)
370
371 =head2 $c->error($arrayref)
372
373 Returns an arrayref containing error messages.  If Catalyst encounters an
374 error while processing a request, it stores the error in $c->error.  This
375 method should only be used to store fatal error messages.
376
377     my @error = @{ $c->error };
378
379 Add a new error.
380
381     $c->error('Something bad happened');
382
383 =cut
384
385 sub error {
386     my $c = shift;
387     if ( $_[0] ) {
388         my $error = ref $_[0] eq 'ARRAY' ? $_[0] : [@_];
389         croak @$error unless ref $c;
390         push @{ $c->{error} }, @$error;
391     }
392     elsif ( defined $_[0] ) { $c->{error} = undef }
393     return $c->{error} || [];
394 }
395
396
397 =head2 $c->state
398
399 Contains the return value of the last executed action.
400
401 =head2 $c->clear_errors
402
403 Clear errors.  You probably don't want to clear the errors unless you are
404 implementing a custom error screen.
405
406 This is equivalent to running
407
408     $c->error(0);
409
410 =cut
411
412 sub clear_errors {
413     my $c = shift;
414     $c->error(0);
415 }
416
417 # search components given a name and some prefixes
418 sub _comp_search_prefixes {
419     my ( $c, $name, @prefixes ) = @_;
420     my $appclass = ref $c || $c;
421     my $filter   = "^${appclass}::(" . join( '|', @prefixes ) . ')::';
422
423     # map the original component name to the sub part that we will search against
424     my %eligible = map { my $n = $_; $n =~ s{^$appclass\::[^:]+::}{}; $_ => $n; }
425         grep { /$filter/ } keys %{ $c->components };
426
427     # undef for a name will return all
428     return keys %eligible if !defined $name;
429
430     my $query  = ref $name ? $name : qr/^$name$/i;
431     my @result = grep { $eligible{$_} =~ m{$query} } keys %eligible;
432
433     return map { $c->components->{ $_ } } @result if @result;
434
435     # if we were given a regexp to search against, we're done.
436     return if ref $name;
437
438     # regexp fallback
439     $query  = qr/$name/i;
440     @result = grep { $eligible{ $_ } =~ m{$query} } keys %eligible;
441
442     # don't warn if we didn't find any results, it just might not exist
443     if( @result ) {
444         $c->log->warn( 'Relying on the regexp fallback behavior for component resolution is unreliable and unsafe.' );
445         $c->log->warn( 'If you really want to search, pass in a regexp as the argument.' );
446     }
447
448     return @result;
449 }
450
451 # Find possible names for a prefix 
452 sub _comp_names {
453     my ( $c, @prefixes ) = @_;
454     my $appclass = ref $c || $c;
455
456     my $filter = "^${appclass}::(" . join( '|', @prefixes ) . ')::';
457
458     my @names = map { s{$filter}{}; $_; } $c->_comp_search_prefixes( undef, @prefixes );
459     return @names;
460 }
461
462 # Filter a component before returning by calling ACCEPT_CONTEXT if available
463 sub _filter_component {
464     my ( $c, $comp, @args ) = @_;
465
466     if ( eval { $comp->can('ACCEPT_CONTEXT'); } ) {
467         return $comp->ACCEPT_CONTEXT( $c, @args );
468     }
469     
470     return $comp;
471 }
472
473 =head2 COMPONENT ACCESSORS
474
475 =head2 $c->controller($name)
476
477 Gets a L<Catalyst::Controller> instance by name.
478
479     $c->controller('Foo')->do_stuff;
480
481 If the name is omitted, will return the controller for the dispatched
482 action.
483
484 If you want to search for controllers, pass in a regexp as the argument.
485
486     # find all controllers that start with Foo
487     my @foo_controllers = $c->controller(qr{^Foo});
488
489
490 =cut
491
492 sub controller {
493     my ( $c, $name, @args ) = @_;
494
495     if( $name ) {
496         my @result = $c->_comp_search_prefixes( $name, qw/Controller C/ );
497         return map { $c->_filter_component( $_, @args ) } @result if ref $name;
498         return $c->_filter_component( $result[ 0 ], @args );
499     }
500
501     return $c->component( $c->action->class );
502 }
503
504 =head2 $c->model($name)
505
506 Gets a L<Catalyst::Model> instance by name.
507
508     $c->model('Foo')->do_stuff;
509
510 Any extra arguments are directly passed to ACCEPT_CONTEXT.
511
512 If the name is omitted, it will look for 
513  - a model object in $c->stash{current_model_instance}, then
514  - a model name in $c->stash->{current_model}, then
515  - a config setting 'default_model', or
516  - check if there is only one model, and return it if that's the case.
517
518 If you want to search for models, pass in a regexp as the argument.
519
520     # find all models that start with Foo
521     my @foo_models = $c->model(qr{^Foo});
522
523 =cut
524
525 sub model {
526     my ( $c, $name, @args ) = @_;
527
528     if( $name ) {
529         my @result = $c->_comp_search_prefixes( $name, qw/Model M/ );
530         return map { $c->_filter_component( $_, @args ) } @result if ref $name;
531         return $c->_filter_component( $result[ 0 ], @args );
532     }
533
534     if (ref $c) {
535         return $c->stash->{current_model_instance} 
536           if $c->stash->{current_model_instance};
537         return $c->model( $c->stash->{current_model} )
538           if $c->stash->{current_model};
539     }
540     return $c->model( $c->config->{default_model} )
541       if $c->config->{default_model};
542
543     my( $comp, $rest ) = $c->_comp_search_prefixes( undef, qw/Model M/);
544
545     if( $rest ) {
546         $c->log->warn( 'Calling $c->model() will return a random model unless you specify one of:' );
547         $c->log->warn( '* $c->config->{default_model} # the name of the default model to use' );
548         $c->log->warn( '* $c->stash->{current_model} # the name of the model to use for this request' );
549         $c->log->warn( '* $c->stash->{current_model_instance} # the instance of the model to use for this request' );
550         $c->log->warn( 'NB: in version 5.80, the "random" behavior will not work at all.' );
551     }
552
553     return $c->_filter_component( $comp );
554 }
555
556
557 =head2 $c->view($name)
558
559 Gets a L<Catalyst::View> instance by name.
560
561     $c->view('Foo')->do_stuff;
562
563 Any extra arguments are directly passed to ACCEPT_CONTEXT.
564
565 If the name is omitted, it will look for 
566  - a view object in $c->stash{current_view_instance}, then
567  - a view name in $c->stash->{current_view}, then
568  - a config setting 'default_view', or
569  - check if there is only one view, and return it if that's the case.
570
571 If you want to search for views, pass in a regexp as the argument.
572
573     # find all views that start with Foo
574     my @foo_views = $c->view(qr{^Foo});
575
576 =cut
577
578 sub view {
579     my ( $c, $name, @args ) = @_;
580
581     if( $name ) {
582         my @result = $c->_comp_search_prefixes( $name, qw/View V/ );
583         return map { $c->_filter_component( $_, @args ) } @result if ref $name;
584         return $c->_filter_component( $result[ 0 ], @args );
585     }
586
587     if (ref $c) {
588         return $c->stash->{current_view_instance} 
589           if $c->stash->{current_view_instance};
590         return $c->view( $c->stash->{current_view} )
591           if $c->stash->{current_view};
592     }
593     return $c->view( $c->config->{default_view} )
594       if $c->config->{default_view};
595
596     my( $comp, $rest ) = $c->_comp_search_prefixes( undef, qw/View V/);
597
598     if( $rest ) {
599         $c->log->warn( 'Calling $c->view() will return a random view unless you specify one of:' );
600         $c->log->warn( '* $c->config->{default_view} # the name of the default view to use' );
601         $c->log->warn( '* $c->stash->{current_view} # the name of the view to use for this request' );
602         $c->log->warn( '* $c->stash->{current_view_instance} # the instance of the view to use for this request' );
603         $c->log->warn( 'NB: in version 5.80, the "random" behavior will not work at all.' );
604     }
605
606     return $c->_filter_component( $comp );
607 }
608
609 =head2 $c->controllers
610
611 Returns the available names which can be passed to $c->controller
612
613 =cut
614
615 sub controllers {
616     my ( $c ) = @_;
617     return $c->_comp_names(qw/Controller C/);
618 }
619
620 =head2 $c->models
621
622 Returns the available names which can be passed to $c->model
623
624 =cut
625
626 sub models {
627     my ( $c ) = @_;
628     return $c->_comp_names(qw/Model M/);
629 }
630
631
632 =head2 $c->views
633
634 Returns the available names which can be passed to $c->view
635
636 =cut
637
638 sub views {
639     my ( $c ) = @_;
640     return $c->_comp_names(qw/View V/);
641 }
642
643 =head2 $c->comp($name)
644
645 =head2 $c->component($name)
646
647 Gets a component object by name. This method is not recommended,
648 unless you want to get a specific component by full
649 class. C<< $c->controller >>, C<< $c->model >>, and C<< $c->view >>
650 should be used instead.
651
652 If C<$name> is a regexp, a list of components matched against the full
653 component name will be returned.
654
655 =cut
656
657 sub component {
658     my ( $c, $name, @args ) = @_;
659
660     if( $name ) {
661         my $comps = $c->components;
662
663         if( !ref $name ) {
664             # is it the exact name?
665             return $comps->{ $name } if exists $comps->{ $name };
666
667             # perhaps we just omitted "MyApp"?
668             my $composed = ( ref $c || $c ) . "::${name}";
669             return $comps->{ $composed } if exists $comps->{ $composed };
670
671             # search all of the models, views and controllers
672             my( $comp ) = $c->_comp_search_prefixes( $name, qw/Model M Controller C View V/ );
673             return $c->_filter_component( $comp, @args ) if $comp;
674         }
675
676         # This is here so $c->comp( '::M::' ) works
677         my $query = ref $name ? $name : qr{$name}i;
678
679         my @result = grep { m{$query} } keys %{ $c->components };
680         return @result if ref $name;
681
682         if( $result[ 0 ] ) {
683             $c->log->warn( 'Relying on the regexp fallback behavior for component resolution' );
684             $c->log->warn( 'is unreliable and unsafe. You have been warned' );
685             return $result[ 0 ];
686         }
687
688         # I would expect to return an empty list here, but that breaks back-compat
689     }
690
691     # fallback
692     return sort keys %{ $c->components };
693 }
694
695 =head2 CLASS DATA AND HELPER CLASSES
696
697 =head2 $c->config
698
699 Returns or takes a hashref containing the application's configuration.
700
701     __PACKAGE__->config( { db => 'dsn:SQLite:foo.db' } );
702
703 You can also use a C<YAML>, C<XML> or C<Config::General> config file
704 like myapp.yml in your applications home directory. See
705 L<Catalyst::Plugin::ConfigLoader>.
706
707     ---
708     db: dsn:SQLite:foo.db
709
710
711 =cut
712
713 sub config {
714     my $c = shift;
715
716     $c->log->warn("Setting config after setup has been run is not a good idea.")
717       if ( @_ and $c->setup_finished );
718
719     $c->NEXT::config(@_);
720 }
721
722 =head2 $c->log
723
724 Returns the logging object instance. Unless it is already set, Catalyst
725 sets this up with a L<Catalyst::Log> object. To use your own log class,
726 set the logger with the C<< __PACKAGE__->log >> method prior to calling
727 C<< __PACKAGE__->setup >>.
728
729  __PACKAGE__->log( MyLogger->new );
730  __PACKAGE__->setup;
731
732 And later:
733
734     $c->log->info( 'Now logging with my own logger!' );
735
736 Your log class should implement the methods described in
737 L<Catalyst::Log>.
738
739
740 =head2 $c->debug
741
742 Overload to enable debug messages (same as -Debug option).
743
744 Note that this is a static method, not an accessor and should be overloaded
745 by declaring "sub debug { 1 }" in your MyApp.pm, not by calling $c->debug(1).
746
747 =cut
748
749 sub debug { 0 }
750
751 =head2 $c->dispatcher
752
753 Returns the dispatcher instance. Stringifies to class name. See
754 L<Catalyst::Dispatcher>.
755
756 =head2 $c->engine
757
758 Returns the engine instance. Stringifies to the class name. See
759 L<Catalyst::Engine>.
760
761
762 =head2 UTILITY METHODS
763
764 =head2 $c->path_to(@path)
765
766 Merges C<@path> with C<< $c->config->{home} >> and returns a
767 L<Path::Class::Dir> object.
768
769 For example:
770
771     $c->path_to( 'db', 'sqlite.db' );
772
773 =cut
774
775 sub path_to {
776     my ( $c, @path ) = @_;
777     my $path = Path::Class::Dir->new( $c->config->{home}, @path );
778     if ( -d $path ) { return $path }
779     else { return Path::Class::File->new( $c->config->{home}, @path ) }
780 }
781
782 =head2 $c->plugin( $name, $class, @args )
783
784 Helper method for plugins. It creates a classdata accessor/mutator and
785 loads and instantiates the given class.
786
787     MyApp->plugin( 'prototype', 'HTML::Prototype' );
788
789     $c->prototype->define_javascript_functions;
790
791 =cut
792
793 sub plugin {
794     my ( $class, $name, $plugin, @args ) = @_;
795     $class->_register_plugin( $plugin, 1 );
796
797     eval { $plugin->import };
798     $class->mk_classdata($name);
799     my $obj;
800     eval { $obj = $plugin->new(@args) };
801
802     if ($@) {
803         Catalyst::Exception->throw( message =>
804               qq/Couldn't instantiate instant plugin "$plugin", "$@"/ );
805     }
806
807     $class->$name($obj);
808     $class->log->debug(qq/Initialized instant plugin "$plugin" as "$name"/)
809       if $class->debug;
810 }
811
812 =head2 MyApp->setup
813
814 Initializes the dispatcher and engine, loads any plugins, and loads the
815 model, view, and controller components. You may also specify an array
816 of plugins to load here, if you choose to not load them in the C<use
817 Catalyst> line.
818
819     MyApp->setup;
820     MyApp->setup( qw/-Debug/ );
821
822 =cut
823
824 sub setup {
825     my ( $class, @arguments ) = @_;
826
827     $class->log->warn("Running setup twice is not a good idea.")
828       if ( $class->setup_finished );
829
830     unless ( $class->isa('Catalyst') ) {
831
832         Catalyst::Exception->throw(
833             message => qq/'$class' does not inherit from Catalyst/ );
834     }
835
836     if ( $class->arguments ) {
837         @arguments = ( @arguments, @{ $class->arguments } );
838     }
839
840     # Process options
841     my $flags = {};
842
843     foreach (@arguments) {
844
845         if (/^-Debug$/) {
846             $flags->{log} =
847               ( $flags->{log} ) ? 'debug,' . $flags->{log} : 'debug';
848         }
849         elsif (/^-(\w+)=?(.*)$/) {
850             $flags->{ lc $1 } = $2;
851         }
852         else {
853             push @{ $flags->{plugins} }, $_;
854         }
855     }
856
857     $class->setup_home( delete $flags->{home} );
858
859     $class->setup_log( delete $flags->{log} );
860     $class->setup_plugins( delete $flags->{plugins} );
861     $class->setup_dispatcher( delete $flags->{dispatcher} );
862     $class->setup_engine( delete $flags->{engine} );
863     $class->setup_stats( delete $flags->{stats} );
864
865     for my $flag ( sort keys %{$flags} ) {
866
867         if ( my $code = $class->can( 'setup_' . $flag ) ) {
868             &$code( $class, delete $flags->{$flag} );
869         }
870         else {
871             $class->log->warn(qq/Unknown flag "$flag"/);
872         }
873     }
874
875     eval { require Catalyst::Devel; };
876     if( !$@ && $ENV{CATALYST_SCRIPT_GEN} && ( $ENV{CATALYST_SCRIPT_GEN} < $Catalyst::Devel::CATALYST_SCRIPT_GEN ) ) {
877         $class->log->warn(<<"EOF");
878 You are running an old script!
879
880   Please update by running (this will overwrite existing files):
881     catalyst.pl -force -scripts $class
882
883   or (this will not overwrite existing files):
884     catalyst.pl -scripts $class
885
886 EOF
887     }
888     
889     if ( $class->debug ) {
890         my @plugins = map { "$_  " . ( $_->VERSION || '' ) } $class->registered_plugins;
891
892         if (@plugins) {
893             my $t = Text::SimpleTable->new(74);
894             $t->row($_) for @plugins;
895             $class->log->debug( "Loaded plugins:\n" . $t->draw . "\n" );
896         }
897
898         my $dispatcher = $class->dispatcher;
899         my $engine     = $class->engine;
900         my $home       = $class->config->{home};
901
902         $class->log->debug(qq/Loaded dispatcher "$dispatcher"/);
903         $class->log->debug(qq/Loaded engine "$engine"/);
904
905         $home
906           ? ( -d $home )
907           ? $class->log->debug(qq/Found home "$home"/)
908           : $class->log->debug(qq/Home "$home" doesn't exist/)
909           : $class->log->debug(q/Couldn't find home/);
910     }
911
912     # Call plugins setup
913     {
914         no warnings qw/redefine/;
915         local *setup = sub { };
916         $class->setup;
917     }
918
919     # Initialize our data structure
920     $class->components( {} );
921
922     $class->setup_components;
923
924     if ( $class->debug ) {
925         my $t = Text::SimpleTable->new( [ 63, 'Class' ], [ 8, 'Type' ] );
926         for my $comp ( sort keys %{ $class->components } ) {
927             my $type = ref $class->components->{$comp} ? 'instance' : 'class';
928             $t->row( $comp, $type );
929         }
930         $class->log->debug( "Loaded components:\n" . $t->draw . "\n" )
931           if ( keys %{ $class->components } );
932     }
933
934     # Add our self to components, since we are also a component
935     $class->components->{$class} = $class;
936
937     $class->setup_actions;
938
939     if ( $class->debug ) {
940         my $name = $class->config->{name} || 'Application';
941         $class->log->info("$name powered by Catalyst $Catalyst::VERSION");
942     }
943     $class->log->_flush() if $class->log->can('_flush');
944
945     $class->setup_finished(1);
946 }
947
948 =head2 $c->uri_for( $path, @args?, \%query_values? )
949
950 Merges path with C<< $c->request->base >> for absolute URIs and with
951 C<< $c->namespace >> for relative URIs, then returns a normalized L<URI>
952 object. If any args are passed, they are added at the end of the path.
953 If the last argument to C<uri_for> is a hash reference, it is assumed to
954 contain GET parameter key/value pairs, which will be appended to the URI
955 in standard fashion.
956
957 Note that uri_for is destructive to the passed hashref.  Subsequent calls
958 with the same hashref may have unintended results.
959
960 Instead of C<$path>, you can also optionally pass a C<$action> object
961 which will be resolved to a path using
962 C<< $c->dispatcher->uri_for_action >>; if the first element of
963 C<@args> is an arrayref it is treated as a list of captures to be passed
964 to C<uri_for_action>.
965
966 =cut
967
968 sub uri_for {
969     my ( $c, $path, @args ) = @_;
970
971     if ( Scalar::Util::blessed($path) ) { # action object
972         my $captures = ( scalar @args && ref $args[0] eq 'ARRAY'
973                          ? shift(@args)
974                          : [] );
975         $path = $c->dispatcher->uri_for_action($path, $captures);
976         return undef unless defined($path);
977         $path = '/' if $path eq '';
978     }
979
980     undef($path) if (defined $path && $path eq '');
981
982     my $params =
983       ( scalar @args && ref $args[$#args] eq 'HASH' ? pop @args : {} );
984
985     carp "uri_for called with undef argument" if grep { ! defined $_ } @args;
986     s/([^$URI::uric])/$URI::Escape::escapes{$1}/go for @args;
987
988     unshift(@args, $path);
989
990     unless (defined $path && $path =~ s!^/!!) { # in-place strip
991         my $namespace = $c->namespace;
992         if (defined $path) { # cheesy hack to handle path '../foo'
993            $namespace =~ s{(?:^|/)[^/]+$}{} while $args[0] =~ s{^\.\./}{};
994         }
995         unshift(@args, $namespace || '');
996     }
997     
998     # join args with '/', or a blank string
999     my $args = join('/', grep { defined($_) } @args);
1000     $args =~ s/\?/%3F/g; # STUPID STUPID SPECIAL CASE
1001     $args =~ s!^/!!;
1002     my $base = $c->req->base;
1003     my $class = ref($base);
1004     $base =~ s{(?<!/)$}{/};
1005
1006     my $query = '';
1007
1008     if (my @keys = keys %$params) {
1009       # somewhat lifted from URI::_query's query_form
1010       $query = '?'.join('&', map {
1011           my $val = $params->{$_};
1012           s/([;\/?:@&=+,\$\[\]%])/$URI::Escape::escapes{$1}/go;
1013           s/ /+/g;
1014           my $key = $_;
1015           $val = '' unless defined $val;
1016           (map {
1017               $_ = "$_";
1018               utf8::encode( $_ ) if utf8::is_utf8($_);
1019               # using the URI::Escape pattern here so utf8 chars survive
1020               s/([^A-Za-z0-9\-_.!~*'() ])/$URI::Escape::escapes{$1}/go;
1021               s/ /+/g;
1022               "${key}=$_"; } ( ref $val eq 'ARRAY' ? @$val : $val ));
1023       } @keys);
1024     }
1025
1026     my $res = bless(\"${base}${args}${query}", $class);
1027     $res;
1028 }
1029
1030 =head2 $c->welcome_message
1031
1032 Returns the Catalyst welcome HTML page.
1033
1034 =cut
1035
1036 sub welcome_message {
1037     my $c      = shift;
1038     my $name   = $c->config->{name};
1039     my $logo   = $c->uri_for('/static/images/catalyst_logo.png');
1040     my $prefix = Catalyst::Utils::appprefix( ref $c );
1041     $c->response->content_type('text/html; charset=utf-8');
1042     return <<"EOF";
1043 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
1044     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
1045 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
1046     <head>
1047     <meta http-equiv="Content-Language" content="en" />
1048     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
1049         <title>$name on Catalyst $VERSION</title>
1050         <style type="text/css">
1051             body {
1052                 color: #000;
1053                 background-color: #eee;
1054             }
1055             div#content {
1056                 width: 640px;
1057                 margin-left: auto;
1058                 margin-right: auto;
1059                 margin-top: 10px;
1060                 margin-bottom: 10px;
1061                 text-align: left;
1062                 background-color: #ccc;
1063                 border: 1px solid #aaa;
1064             }
1065             p, h1, h2 {
1066                 margin-left: 20px;
1067                 margin-right: 20px;
1068                 font-family: verdana, tahoma, sans-serif;
1069             }
1070             a {
1071                 font-family: verdana, tahoma, sans-serif;
1072             }
1073             :link, :visited {
1074                     text-decoration: none;
1075                     color: #b00;
1076                     border-bottom: 1px dotted #bbb;
1077             }
1078             :link:hover, :visited:hover {
1079                     color: #555;
1080             }
1081             div#topbar {
1082                 margin: 0px;
1083             }
1084             pre {
1085                 margin: 10px;
1086                 padding: 8px;
1087             }
1088             div#answers {
1089                 padding: 8px;
1090                 margin: 10px;
1091                 background-color: #fff;
1092                 border: 1px solid #aaa;
1093             }
1094             h1 {
1095                 font-size: 0.9em;
1096                 font-weight: normal;
1097                 text-align: center;
1098             }
1099             h2 {
1100                 font-size: 1.0em;
1101             }
1102             p {
1103                 font-size: 0.9em;
1104             }
1105             p img {
1106                 float: right;
1107                 margin-left: 10px;
1108             }
1109             span#appname {
1110                 font-weight: bold;
1111                 font-size: 1.6em;
1112             }
1113         </style>
1114     </head>
1115     <body>
1116         <div id="content">
1117             <div id="topbar">
1118                 <h1><span id="appname">$name</span> on <a href="http://catalyst.perl.org">Catalyst</a>
1119                     $VERSION</h1>
1120              </div>
1121              <div id="answers">
1122                  <p>
1123                  <img src="$logo" alt="Catalyst Logo" />
1124                  </p>
1125                  <p>Welcome to the  world of Catalyst.
1126                     This <a href="http://en.wikipedia.org/wiki/MVC">MVC</a>
1127                     framework will make web development something you had
1128                     never expected it to be: Fun, rewarding, and quick.</p>
1129                  <h2>What to do now?</h2>
1130                  <p>That really depends  on what <b>you</b> want to do.
1131                     We do, however, provide you with a few starting points.</p>
1132                  <p>If you want to jump right into web development with Catalyst
1133                     you might want to start with a tutorial.</p>
1134 <pre>perldoc <a href="http://cpansearch.perl.org/dist/Catalyst-Manual/lib/Catalyst/Manual/Tutorial.pod">Catalyst::Manual::Tutorial</a></code>
1135 </pre>
1136 <p>Afterwards you can go on to check out a more complete look at our features.</p>
1137 <pre>
1138 <code>perldoc <a href="http://cpansearch.perl.org/dist/Catalyst-Manual/lib/Catalyst/Manual/Intro.pod">Catalyst::Manual::Intro</a>
1139 <!-- Something else should go here, but the Catalyst::Manual link seems unhelpful -->
1140 </code></pre>
1141                  <h2>What to do next?</h2>
1142                  <p>Next it's time to write an actual application. Use the
1143                     helper scripts to generate <a href="http://cpansearch.perl.org/search?query=Catalyst%3A%3AController%3A%3A&amp;mode=all">controllers</a>,
1144                     <a href="http://cpansearch.perl.org/search?query=Catalyst%3A%3AModel%3A%3A&amp;mode=all">models</a>, and
1145                     <a href="http://cpansearch.perl.org/search?query=Catalyst%3A%3AView%3A%3A&amp;mode=all">views</a>;
1146                     they can save you a lot of work.</p>
1147                     <pre><code>script/${prefix}_create.pl -help</code></pre>
1148                     <p>Also, be sure to check out the vast and growing
1149                     collection of <a href="http://cpansearch.perl.org/search?query=Catalyst%3A%3APlugin%3A%3A&amp;mode=all">plugins for Catalyst on CPAN</a>;
1150                     you are likely to find what you need there.
1151                     </p>
1152
1153                  <h2>Need help?</h2>
1154                  <p>Catalyst has a very active community. Here are the main places to
1155                     get in touch with us.</p>
1156                  <ul>
1157                      <li>
1158                          <a href="http://dev.catalyst.perl.org">Wiki</a>
1159                      </li>
1160                      <li>
1161                          <a href="http://lists.rawmode.org/mailman/listinfo/catalyst">Mailing-List</a>
1162                      </li>
1163                      <li>
1164                          <a href="irc://irc.perl.org/catalyst">IRC channel #catalyst on irc.perl.org</a>
1165                      </li>
1166                  </ul>
1167                  <h2>In conclusion</h2>
1168                  <p>The Catalyst team hopes you will enjoy using Catalyst as much 
1169                     as we enjoyed making it. Please contact us if you have ideas
1170                     for improvement or other feedback.</p>
1171              </div>
1172          </div>
1173     </body>
1174 </html>
1175 EOF
1176 }
1177
1178 =head1 INTERNAL METHODS
1179
1180 These methods are not meant to be used by end users.
1181
1182 =head2 $c->components
1183
1184 Returns a hash of components.
1185
1186 =head2 $c->context_class
1187
1188 Returns or sets the context class.
1189
1190 =head2 $c->counter
1191
1192 Returns a hashref containing coderefs and execution counts (needed for
1193 deep recursion detection).
1194
1195 =head2 $c->depth
1196
1197 Returns the number of actions on the current internal execution stack.
1198
1199 =head2 $c->dispatch
1200
1201 Dispatches a request to actions.
1202
1203 =cut
1204
1205 sub dispatch { my $c = shift; $c->dispatcher->dispatch( $c, @_ ) }
1206
1207 =head2 $c->dispatcher_class
1208
1209 Returns or sets the dispatcher class.
1210
1211 =head2 $c->dump_these
1212
1213 Returns a list of 2-element array references (name, structure) pairs
1214 that will be dumped on the error page in debug mode.
1215
1216 =cut
1217
1218 sub dump_these {
1219     my $c = shift;
1220     [ Request => $c->req ], 
1221     [ Response => $c->res ], 
1222     [ Stash => $c->stash ],
1223     [ Config => $c->config ];
1224 }
1225
1226 =head2 $c->engine_class
1227
1228 Returns or sets the engine class.
1229
1230 =head2 $c->execute( $class, $coderef )
1231
1232 Execute a coderef in given class and catch exceptions. Errors are available
1233 via $c->error.
1234
1235 =cut
1236
1237 sub execute {
1238     my ( $c, $class, $code ) = @_;
1239     $class = $c->component($class) || $class;
1240     $c->state(0);
1241
1242     if ( $c->depth >= $RECURSION ) {
1243         my $action = "$code";
1244         $action = "/$action" unless $action =~ /->/;
1245         my $error = qq/Deep recursion detected calling "$action"/;
1246         $c->log->error($error);
1247         $c->error($error);
1248         $c->state(0);
1249         return $c->state;
1250     }
1251
1252     my $stats_info = $c->_stats_start_execute( $code ) if $c->use_stats;
1253
1254     push( @{ $c->stack }, $code );
1255     
1256     eval { $c->state( &$code( $class, $c, @{ $c->req->args } ) || 0 ) };
1257
1258     $c->_stats_finish_execute( $stats_info ) if $c->use_stats and $stats_info;
1259     
1260     my $last = pop( @{ $c->stack } );
1261
1262     if ( my $error = $@ ) {
1263         if ( !ref($error) and $error eq $DETACH ) { die $DETACH if $c->depth > 1 }
1264         else {
1265             unless ( ref $error ) {
1266                 no warnings 'uninitialized';
1267                 chomp $error;
1268                 my $class = $last->class;
1269                 my $name  = $last->name;
1270                 $error = qq/Caught exception in $class->$name "$error"/;
1271             }
1272             $c->error($error);
1273             $c->state(0);
1274         }
1275     }
1276     return $c->state;
1277 }
1278
1279 sub _stats_start_execute {
1280     my ( $c, $code ) = @_;
1281
1282     return if ( ( $code->name =~ /^_.*/ )
1283         && ( !$c->config->{show_internal_actions} ) );
1284
1285     $c->counter->{"$code"}++;
1286
1287     my $action = "$code";
1288     $action = "/$action" unless $action =~ /->/;
1289
1290     # determine if the call was the result of a forward
1291     # this is done by walking up the call stack and looking for a calling
1292     # sub of Catalyst::forward before the eval
1293     my $callsub = q{};
1294     for my $index ( 2 .. 11 ) {
1295         last
1296         if ( ( caller($index) )[0] eq 'Catalyst'
1297             && ( caller($index) )[3] eq '(eval)' );
1298
1299         if ( ( caller($index) )[3] =~ /forward$/ ) {
1300             $callsub = ( caller($index) )[3];
1301             $action  = "-> $action";
1302             last;
1303         }
1304     }
1305
1306     my $uid = "$code" . $c->counter->{"$code"};
1307
1308     # is this a root-level call or a forwarded call?
1309     if ( $callsub =~ /forward$/ ) {
1310
1311         # forward, locate the caller
1312         if ( my $parent = $c->stack->[-1] ) {
1313             $c->stats->profile(
1314                 begin  => $action, 
1315                 parent => "$parent" . $c->counter->{"$parent"},
1316                 uid    => $uid,
1317             );
1318         }
1319         else {
1320
1321             # forward with no caller may come from a plugin
1322             $c->stats->profile(
1323                 begin => $action,
1324                 uid   => $uid,
1325             );
1326         }
1327     }
1328     else {
1329         
1330         # root-level call
1331         $c->stats->profile(
1332             begin => $action,
1333             uid   => $uid,
1334         );
1335     }
1336     return $action;
1337
1338 }
1339
1340 sub _stats_finish_execute {
1341     my ( $c, $info ) = @_;
1342     $c->stats->profile( end => $info );
1343 }
1344
1345 =head2 $c->_localize_fields( sub { }, \%keys );
1346
1347 =cut
1348
1349 sub _localize_fields {
1350     my ( $c, $localized, $code ) = ( @_ );
1351
1352     my $request = delete $localized->{request} || {};
1353     my $response = delete $localized->{response} || {};
1354     
1355     local @{ $c }{ keys %$localized } = values %$localized;
1356     local @{ $c->request }{ keys %$request } = values %$request;
1357     local @{ $c->response }{ keys %$response } = values %$response;
1358
1359     $code->();
1360 }
1361
1362 =head2 $c->finalize
1363
1364 Finalizes the request.
1365
1366 =cut
1367
1368 sub finalize {
1369     my $c = shift;
1370
1371     for my $error ( @{ $c->error } ) {
1372         $c->log->error($error);
1373     }
1374
1375     # Allow engine to handle finalize flow (for POE)
1376     if ( $c->engine->can('finalize') ) {
1377         $c->engine->finalize($c);
1378     }
1379     else {
1380
1381         $c->finalize_uploads;
1382
1383         # Error
1384         if ( $#{ $c->error } >= 0 ) {
1385             $c->finalize_error;
1386         }
1387
1388         $c->finalize_headers;
1389
1390         # HEAD request
1391         if ( $c->request->method eq 'HEAD' ) {
1392             $c->response->body('');
1393         }
1394
1395         $c->finalize_body;
1396     }
1397     
1398     if ($c->use_stats) {        
1399         my $elapsed = sprintf '%f', $c->stats->elapsed;
1400         my $av = $elapsed == 0 ? '??' : sprintf '%.3f', 1 / $elapsed;
1401         $c->log->info(
1402             "Request took ${elapsed}s ($av/s)\n" . $c->stats->report . "\n" );        
1403     }
1404
1405     return $c->response->status;
1406 }
1407
1408 =head2 $c->finalize_body
1409
1410 Finalizes body.
1411
1412 =cut
1413
1414 sub finalize_body { my $c = shift; $c->engine->finalize_body( $c, @_ ) }
1415
1416 =head2 $c->finalize_cookies
1417
1418 Finalizes cookies.
1419
1420 =cut
1421
1422 sub finalize_cookies { my $c = shift; $c->engine->finalize_cookies( $c, @_ ) }
1423
1424 =head2 $c->finalize_error
1425
1426 Finalizes error.
1427
1428 =cut
1429
1430 sub finalize_error { my $c = shift; $c->engine->finalize_error( $c, @_ ) }
1431
1432 =head2 $c->finalize_headers
1433
1434 Finalizes headers.
1435
1436 =cut
1437
1438 sub finalize_headers {
1439     my $c = shift;
1440
1441     # Check if we already finalized headers
1442     return if $c->response->{_finalized_headers};
1443
1444     # Handle redirects
1445     if ( my $location = $c->response->redirect ) {
1446         $c->log->debug(qq/Redirecting to "$location"/) if $c->debug;
1447         $c->response->header( Location => $location );
1448         
1449         if ( !$c->response->body ) {
1450             # Add a default body if none is already present
1451             $c->response->body(
1452                 qq{<html><body><p>This item has moved <a href="$location">here</a>.</p></body></html>}
1453             );
1454         }
1455     }
1456
1457     # Content-Length
1458     if ( $c->response->body && !$c->response->content_length ) {
1459
1460         # get the length from a filehandle
1461         if ( blessed( $c->response->body ) && $c->response->body->can('read') )
1462         {
1463             my $stat = stat $c->response->body;
1464             if ( $stat && $stat->size > 0 ) {
1465                 $c->response->content_length( $stat->size );
1466             }
1467             else {
1468                 $c->log->warn('Serving filehandle without a content-length');
1469             }
1470         }
1471         else {
1472             # everything should be bytes at this point, but just in case
1473             $c->response->content_length( bytes::length( $c->response->body ) );
1474         }
1475     }
1476
1477     # Errors
1478     if ( $c->response->status =~ /^(1\d\d|[23]04)$/ ) {
1479         $c->response->headers->remove_header("Content-Length");
1480         $c->response->body('');
1481     }
1482
1483     $c->finalize_cookies;
1484
1485     $c->engine->finalize_headers( $c, @_ );
1486
1487     # Done
1488     $c->response->{_finalized_headers} = 1;
1489 }
1490
1491 =head2 $c->finalize_output
1492
1493 An alias for finalize_body.
1494
1495 =head2 $c->finalize_read
1496
1497 Finalizes the input after reading is complete.
1498
1499 =cut
1500
1501 sub finalize_read { my $c = shift; $c->engine->finalize_read( $c, @_ ) }
1502
1503 =head2 $c->finalize_uploads
1504
1505 Finalizes uploads. Cleans up any temporary files.
1506
1507 =cut
1508
1509 sub finalize_uploads { my $c = shift; $c->engine->finalize_uploads( $c, @_ ) }
1510
1511 =head2 $c->get_action( $action, $namespace )
1512
1513 Gets an action in a given namespace.
1514
1515 =cut
1516
1517 sub get_action { my $c = shift; $c->dispatcher->get_action(@_) }
1518
1519 =head2 $c->get_actions( $action, $namespace )
1520
1521 Gets all actions of a given name in a namespace and all parent
1522 namespaces.
1523
1524 =cut
1525
1526 sub get_actions { my $c = shift; $c->dispatcher->get_actions( $c, @_ ) }
1527
1528 =head2 $c->handle_request( $class, @arguments )
1529
1530 Called to handle each HTTP request.
1531
1532 =cut
1533
1534 sub handle_request {
1535     my ( $class, @arguments ) = @_;
1536
1537     # Always expect worst case!
1538     my $status = -1;
1539     eval {
1540         if ($class->debug) {
1541             my $secs = time - $START || 1;
1542             my $av = sprintf '%.3f', $COUNT / $secs;
1543             my $time = localtime time;
1544             $class->log->info("*** Request $COUNT ($av/s) [$$] [$time] ***");
1545         }
1546
1547         my $c = $class->prepare(@arguments);
1548         $c->dispatch;
1549         $status = $c->finalize;   
1550     };
1551
1552     if ( my $error = $@ ) {
1553         chomp $error;
1554         $class->log->error(qq/Caught exception in engine "$error"/);
1555     }
1556
1557     $COUNT++;
1558     $class->log->_flush() if $class->log->can('_flush');
1559     return $status;
1560 }
1561
1562 =head2 $c->prepare( @arguments )
1563
1564 Creates a Catalyst context from an engine-specific request (Apache, CGI,
1565 etc.).
1566
1567 =cut
1568
1569 sub prepare {
1570     my ( $class, @arguments ) = @_;
1571
1572     $class->context_class( ref $class || $class ) unless $class->context_class;
1573     my $c = $class->context_class->new(
1574         {
1575             counter => {},
1576             stack   => [],
1577             request => $class->request_class->new(
1578                 {
1579                     arguments        => [],
1580                     body_parameters  => {},
1581                     cookies          => {},
1582                     headers          => HTTP::Headers->new,
1583                     parameters       => {},
1584                     query_parameters => {},
1585                     secure           => 0,
1586                     captures         => [],
1587                     uploads          => {}
1588                 }
1589             ),
1590             response => $class->response_class->new(
1591                 {
1592                     body    => '',
1593                     cookies => {},
1594                     headers => HTTP::Headers->new(),
1595                     status  => 200
1596                 }
1597             ),
1598             stash => {},
1599             state => 0
1600         }
1601     );
1602
1603     $c->stats($class->stats_class->new)->enable($c->use_stats);
1604     if ( $c->debug ) {
1605         $c->res->headers->header( 'X-Catalyst' => $Catalyst::VERSION );            
1606     }
1607
1608     # For on-demand data
1609     $c->request->{_context}  = $c;
1610     $c->response->{_context} = $c;
1611     weaken( $c->request->{_context} );
1612     weaken( $c->response->{_context} );
1613
1614     # Allow engine to direct the prepare flow (for POE)
1615     if ( $c->engine->can('prepare') ) {
1616         $c->engine->prepare( $c, @arguments );
1617     }
1618     else {
1619         $c->prepare_request(@arguments);
1620         $c->prepare_connection;
1621         $c->prepare_query_parameters;
1622         $c->prepare_headers;
1623         $c->prepare_cookies;
1624         $c->prepare_path;
1625
1626         # Prepare the body for reading, either by prepare_body
1627         # or the user, if they are using $c->read
1628         $c->prepare_read;
1629         
1630         # Parse the body unless the user wants it on-demand
1631         unless ( $c->config->{parse_on_demand} ) {
1632             $c->prepare_body;
1633         }
1634     }
1635
1636     my $method  = $c->req->method  || '';
1637     my $path    = $c->req->path;
1638     $path       = '/' unless length $path;
1639     my $address = $c->req->address || '';
1640
1641     $c->log->debug(qq/"$method" request for "$path" from "$address"/)
1642       if $c->debug;
1643
1644     $c->prepare_action;
1645
1646     return $c;
1647 }
1648
1649 =head2 $c->prepare_action
1650
1651 Prepares action. See L<Catalyst::Dispatcher>.
1652
1653 =cut
1654
1655 sub prepare_action { my $c = shift; $c->dispatcher->prepare_action( $c, @_ ) }
1656
1657 =head2 $c->prepare_body
1658
1659 Prepares message body.
1660
1661 =cut
1662
1663 sub prepare_body {
1664     my $c = shift;
1665
1666     # Do we run for the first time?
1667     return if defined $c->request->{_body};
1668
1669     # Initialize on-demand data
1670     $c->engine->prepare_body( $c, @_ );
1671     $c->prepare_parameters;
1672     $c->prepare_uploads;
1673
1674     if ( $c->debug && keys %{ $c->req->body_parameters } ) {
1675         my $t = Text::SimpleTable->new( [ 35, 'Parameter' ], [ 36, 'Value' ] );
1676         for my $key ( sort keys %{ $c->req->body_parameters } ) {
1677             my $param = $c->req->body_parameters->{$key};
1678             my $value = defined($param) ? $param : '';
1679             $t->row( $key,
1680                 ref $value eq 'ARRAY' ? ( join ', ', @$value ) : $value );
1681         }
1682         $c->log->debug( "Body Parameters are:\n" . $t->draw );
1683     }
1684 }
1685
1686 =head2 $c->prepare_body_chunk( $chunk )
1687
1688 Prepares a chunk of data before sending it to L<HTTP::Body>.
1689
1690 See L<Catalyst::Engine>.
1691
1692 =cut
1693
1694 sub prepare_body_chunk {
1695     my $c = shift;
1696     $c->engine->prepare_body_chunk( $c, @_ );
1697 }
1698
1699 =head2 $c->prepare_body_parameters
1700
1701 Prepares body parameters.
1702
1703 =cut
1704
1705 sub prepare_body_parameters {
1706     my $c = shift;
1707     $c->engine->prepare_body_parameters( $c, @_ );
1708 }
1709
1710 =head2 $c->prepare_connection
1711
1712 Prepares connection.
1713
1714 =cut
1715
1716 sub prepare_connection {
1717     my $c = shift;
1718     $c->engine->prepare_connection( $c, @_ );
1719 }
1720
1721 =head2 $c->prepare_cookies
1722
1723 Prepares cookies.
1724
1725 =cut
1726
1727 sub prepare_cookies { my $c = shift; $c->engine->prepare_cookies( $c, @_ ) }
1728
1729 =head2 $c->prepare_headers
1730
1731 Prepares headers.
1732
1733 =cut
1734
1735 sub prepare_headers { my $c = shift; $c->engine->prepare_headers( $c, @_ ) }
1736
1737 =head2 $c->prepare_parameters
1738
1739 Prepares parameters.
1740
1741 =cut
1742
1743 sub prepare_parameters {
1744     my $c = shift;
1745     $c->prepare_body_parameters;
1746     $c->engine->prepare_parameters( $c, @_ );
1747 }
1748
1749 =head2 $c->prepare_path
1750
1751 Prepares path and base.
1752
1753 =cut
1754
1755 sub prepare_path { my $c = shift; $c->engine->prepare_path( $c, @_ ) }
1756
1757 =head2 $c->prepare_query_parameters
1758
1759 Prepares query parameters.
1760
1761 =cut
1762
1763 sub prepare_query_parameters {
1764     my $c = shift;
1765
1766     $c->engine->prepare_query_parameters( $c, @_ );
1767
1768     if ( $c->debug && keys %{ $c->request->query_parameters } ) {
1769         my $t = Text::SimpleTable->new( [ 35, 'Parameter' ], [ 36, 'Value' ] );
1770         for my $key ( sort keys %{ $c->req->query_parameters } ) {
1771             my $param = $c->req->query_parameters->{$key};
1772             my $value = defined($param) ? $param : '';
1773             $t->row( $key,
1774                 ref $value eq 'ARRAY' ? ( join ', ', @$value ) : $value );
1775         }
1776         $c->log->debug( "Query Parameters are:\n" . $t->draw );
1777     }
1778 }
1779
1780 =head2 $c->prepare_read
1781
1782 Prepares the input for reading.
1783
1784 =cut
1785
1786 sub prepare_read { my $c = shift; $c->engine->prepare_read( $c, @_ ) }
1787
1788 =head2 $c->prepare_request
1789
1790 Prepares the engine request.
1791
1792 =cut
1793
1794 sub prepare_request { my $c = shift; $c->engine->prepare_request( $c, @_ ) }
1795
1796 =head2 $c->prepare_uploads
1797
1798 Prepares uploads.
1799
1800 =cut
1801
1802 sub prepare_uploads {
1803     my $c = shift;
1804
1805     $c->engine->prepare_uploads( $c, @_ );
1806
1807     if ( $c->debug && keys %{ $c->request->uploads } ) {
1808         my $t = Text::SimpleTable->new(
1809             [ 12, 'Parameter' ],
1810             [ 26, 'Filename' ],
1811             [ 18, 'Type' ],
1812             [ 9,  'Size' ]
1813         );
1814         for my $key ( sort keys %{ $c->request->uploads } ) {
1815             my $upload = $c->request->uploads->{$key};
1816             for my $u ( ref $upload eq 'ARRAY' ? @{$upload} : ($upload) ) {
1817                 $t->row( $key, $u->filename, $u->type, $u->size );
1818             }
1819         }
1820         $c->log->debug( "File Uploads are:\n" . $t->draw );
1821     }
1822 }
1823
1824 =head2 $c->prepare_write
1825
1826 Prepares the output for writing.
1827
1828 =cut
1829
1830 sub prepare_write { my $c = shift; $c->engine->prepare_write( $c, @_ ) }
1831
1832 =head2 $c->request_class
1833
1834 Returns or sets the request class.
1835
1836 =head2 $c->response_class
1837
1838 Returns or sets the response class.
1839
1840 =head2 $c->read( [$maxlength] )
1841
1842 Reads a chunk of data from the request body. This method is designed to
1843 be used in a while loop, reading C<$maxlength> bytes on every call.
1844 C<$maxlength> defaults to the size of the request if not specified.
1845
1846 You have to set C<< MyApp->config->{parse_on_demand} >> to use this
1847 directly.
1848
1849 Warning: If you use read(), Catalyst will not process the body,
1850 so you will not be able to access POST parameters or file uploads via
1851 $c->request.  You must handle all body parsing yourself.
1852
1853 =cut
1854
1855 sub read { my $c = shift; return $c->engine->read( $c, @_ ) }
1856
1857 =head2 $c->run
1858
1859 Starts the engine.
1860
1861 =cut
1862
1863 sub run { my $c = shift; return $c->engine->run( $c, @_ ) }
1864
1865 =head2 $c->set_action( $action, $code, $namespace, $attrs )
1866
1867 Sets an action in a given namespace.
1868
1869 =cut
1870
1871 sub set_action { my $c = shift; $c->dispatcher->set_action( $c, @_ ) }
1872
1873 =head2 $c->setup_actions($component)
1874
1875 Sets up actions for a component.
1876
1877 =cut
1878
1879 sub setup_actions { my $c = shift; $c->dispatcher->setup_actions( $c, @_ ) }
1880
1881 =head2 $c->setup_components
1882
1883 Sets up components. Specify a C<setup_components> config option to pass
1884 additional options directly to L<Module::Pluggable>. To add additional
1885 search paths, specify a key named C<search_extra> as an array
1886 reference. Items in the array beginning with C<::> will have the
1887 application class name prepended to them.
1888
1889 =cut
1890
1891 sub setup_components {
1892     my $class = shift;
1893
1894     my @paths   = qw( ::Controller ::C ::Model ::M ::View ::V );
1895     my $config  = $class->config->{ setup_components };
1896     my $extra   = delete $config->{ search_extra } || [];
1897     
1898     push @paths, @$extra;
1899         
1900     my $locator = Module::Pluggable::Object->new(
1901         search_path => [ map { s/^(?=::)/$class/; $_; } @paths ],
1902         %$config
1903     );
1904
1905     my @comps = sort { length $a <=> length $b } $locator->plugins;
1906     my %comps = map { $_ => 1 } @comps;
1907     
1908     for my $component ( @comps ) {
1909
1910         # We pass ignore_loaded here so that overlay files for (e.g.)
1911         # Model::DBI::Schema sub-classes are loaded - if it's in @comps
1912         # we know M::P::O found a file on disk so this is safe
1913
1914         Catalyst::Utils::ensure_class_loaded( $component, { ignore_loaded => 1 } );
1915
1916         my $module  = $class->setup_component( $component );
1917         my %modules = (
1918             $component => $module,
1919             map {
1920                 $_ => $class->setup_component( $_ )
1921             } grep { 
1922               not exists $comps{$_}
1923             } Devel::InnerPackage::list_packages( $component )
1924         );
1925         
1926         for my $key ( keys %modules ) {
1927             $class->components->{ $key } = $modules{ $key };
1928         }
1929     }
1930 }
1931
1932 =head2 $c->setup_component
1933
1934 =cut
1935
1936 sub setup_component {
1937     my( $class, $component ) = @_;
1938
1939     unless ( $component->can( 'COMPONENT' ) ) {
1940         return $component;
1941     }
1942
1943     my $suffix = Catalyst::Utils::class2classsuffix( $component );
1944     my $config = $class->config->{ $suffix } || {};
1945
1946     my $instance = eval { $component->COMPONENT( $class, $config ); };
1947
1948     if ( my $error = $@ ) {
1949         chomp $error;
1950         Catalyst::Exception->throw(
1951             message => qq/Couldn't instantiate component "$component", "$error"/
1952         );
1953     }
1954
1955     Catalyst::Exception->throw(
1956         message =>
1957         qq/Couldn't instantiate component "$component", "COMPONENT() didn't return an object-like value"/
1958     ) unless eval { $instance->can( 'can' ) };
1959
1960     return $instance;
1961 }
1962
1963 =head2 $c->setup_dispatcher
1964
1965 Sets up dispatcher.
1966
1967 =cut
1968
1969 sub setup_dispatcher {
1970     my ( $class, $dispatcher ) = @_;
1971
1972     if ($dispatcher) {
1973         $dispatcher = 'Catalyst::Dispatcher::' . $dispatcher;
1974     }
1975
1976     if ( my $env = Catalyst::Utils::env_value( $class, 'DISPATCHER' ) ) {
1977         $dispatcher = 'Catalyst::Dispatcher::' . $env;
1978     }
1979
1980     unless ($dispatcher) {
1981         $dispatcher = $class->dispatcher_class;
1982     }
1983
1984     unless (Class::Inspector->loaded($dispatcher)) {
1985         require Class::Inspector->filename($dispatcher);
1986     }
1987
1988     # dispatcher instance
1989     $class->dispatcher( $dispatcher->new );
1990 }
1991
1992 =head2 $c->setup_engine
1993
1994 Sets up engine.
1995
1996 =cut
1997
1998 sub setup_engine {
1999     my ( $class, $engine ) = @_;
2000
2001     if ($engine) {
2002         $engine = 'Catalyst::Engine::' . $engine;
2003     }
2004
2005     if ( my $env = Catalyst::Utils::env_value( $class, 'ENGINE' ) ) {
2006         $engine = 'Catalyst::Engine::' . $env;
2007     }
2008
2009     if ( $ENV{MOD_PERL} ) {
2010
2011         # create the apache method
2012         {
2013             no strict 'refs';
2014             *{"$class\::apache"} = sub { shift->engine->apache };
2015         }
2016
2017         my ( $software, $version ) =
2018           $ENV{MOD_PERL} =~ /^(\S+)\/(\d+(?:[\.\_]\d+)+)/;
2019
2020         $version =~ s/_//g;
2021         $version =~ s/(\.[^.]+)\./$1/g;
2022
2023         if ( $software eq 'mod_perl' ) {
2024
2025             if ( !$engine ) {
2026
2027                 if ( $version >= 1.99922 ) {
2028                     $engine = 'Catalyst::Engine::Apache2::MP20';
2029                 }
2030
2031                 elsif ( $version >= 1.9901 ) {
2032                     $engine = 'Catalyst::Engine::Apache2::MP19';
2033                 }
2034
2035                 elsif ( $version >= 1.24 ) {
2036                     $engine = 'Catalyst::Engine::Apache::MP13';
2037                 }
2038
2039                 else {
2040                     Catalyst::Exception->throw( message =>
2041                           qq/Unsupported mod_perl version: $ENV{MOD_PERL}/ );
2042                 }
2043
2044             }
2045
2046             # install the correct mod_perl handler
2047             if ( $version >= 1.9901 ) {
2048                 *handler = sub  : method {
2049                     shift->handle_request(@_);
2050                 };
2051             }
2052             else {
2053                 *handler = sub ($$) { shift->handle_request(@_) };
2054             }
2055
2056         }
2057
2058         elsif ( $software eq 'Zeus-Perl' ) {
2059             $engine = 'Catalyst::Engine::Zeus';
2060         }
2061
2062         else {
2063             Catalyst::Exception->throw(
2064                 message => qq/Unsupported mod_perl: $ENV{MOD_PERL}/ );
2065         }
2066     }
2067
2068     unless ($engine) {
2069         $engine = $class->engine_class;
2070     }
2071
2072     unless (Class::Inspector->loaded($engine)) {
2073         require Class::Inspector->filename($engine);
2074     }
2075
2076     # check for old engines that are no longer compatible
2077     my $old_engine;
2078     if ( $engine->isa('Catalyst::Engine::Apache')
2079         && !Catalyst::Engine::Apache->VERSION )
2080     {
2081         $old_engine = 1;
2082     }
2083
2084     elsif ( $engine->isa('Catalyst::Engine::Server::Base')
2085         && Catalyst::Engine::Server->VERSION le '0.02' )
2086     {
2087         $old_engine = 1;
2088     }
2089
2090     elsif ($engine->isa('Catalyst::Engine::HTTP::POE')
2091         && $engine->VERSION eq '0.01' )
2092     {
2093         $old_engine = 1;
2094     }
2095
2096     elsif ($engine->isa('Catalyst::Engine::Zeus')
2097         && $engine->VERSION eq '0.01' )
2098     {
2099         $old_engine = 1;
2100     }
2101
2102     if ($old_engine) {
2103         Catalyst::Exception->throw( message =>
2104               qq/Engine "$engine" is not supported by this version of Catalyst/
2105         );
2106     }
2107
2108     # engine instance
2109     $class->engine( $engine->new );
2110 }
2111
2112 =head2 $c->setup_home
2113
2114 Sets up the home directory.
2115
2116 =cut
2117
2118 sub setup_home {
2119     my ( $class, $home ) = @_;
2120
2121     if ( my $env = Catalyst::Utils::env_value( $class, 'HOME' ) ) {
2122         $home = $env;
2123     }
2124
2125     unless ($home) {
2126         $home = Catalyst::Utils::home($class);
2127     }
2128
2129     if ($home) {
2130         $class->config->{home} ||= $home;
2131         $class->config->{root} ||= Path::Class::Dir->new($home)->subdir('root');
2132     }
2133 }
2134
2135 =head2 $c->setup_log
2136
2137 Sets up log.
2138
2139 =cut
2140
2141 sub setup_log {
2142     my ( $class, $debug ) = @_;
2143
2144     unless ( $class->log ) {
2145         $class->log( Catalyst::Log->new );
2146     }
2147
2148     my $env_debug = Catalyst::Utils::env_value( $class, 'DEBUG' );
2149     if ( defined($env_debug) ? $env_debug : $debug ) {
2150         no strict 'refs';
2151         *{"$class\::debug"} = sub { 1 };
2152         $class->log->debug('Debug messages enabled');
2153     }
2154 }
2155
2156 =head2 $c->setup_plugins
2157
2158 Sets up plugins.
2159
2160 =cut
2161
2162 =head2 $c->setup_stats
2163
2164 Sets up timing statistics class.
2165
2166 =cut
2167
2168 sub setup_stats {
2169     my ( $class, $stats ) = @_;
2170
2171     Catalyst::Utils::ensure_class_loaded($class->stats_class);
2172
2173     my $env = Catalyst::Utils::env_value( $class, 'STATS' );
2174     if ( defined($env) ? $env : ($stats || $class->debug ) ) {
2175         no strict 'refs';
2176         *{"$class\::use_stats"} = sub { 1 };
2177         $class->log->debug('Statistics enabled');
2178     }
2179 }
2180
2181
2182 =head2 $c->registered_plugins 
2183
2184 Returns a sorted list of the plugins which have either been stated in the
2185 import list or which have been added via C<< MyApp->plugin(@args); >>.
2186
2187 If passed a given plugin name, it will report a boolean value indicating
2188 whether or not that plugin is loaded.  A fully qualified name is required if
2189 the plugin name does not begin with C<Catalyst::Plugin::>.
2190
2191  if ($c->registered_plugins('Some::Plugin')) {
2192      ...
2193  }
2194
2195 =cut
2196
2197 {
2198
2199     sub registered_plugins {
2200         my $proto = shift;
2201         return sort keys %{ $proto->_plugins } unless @_;
2202         my $plugin = shift;
2203         return 1 if exists $proto->_plugins->{$plugin};
2204         return exists $proto->_plugins->{"Catalyst::Plugin::$plugin"};
2205     }
2206
2207     sub _register_plugin {
2208         my ( $proto, $plugin, $instant ) = @_;
2209         my $class = ref $proto || $proto;
2210
2211         # no ignore_loaded here, the plugin may already have been
2212         # defined in memory and we don't want to error on "no file" if so
2213
2214         Catalyst::Utils::ensure_class_loaded( $plugin );
2215
2216         $proto->_plugins->{$plugin} = 1;
2217         unless ($instant) {
2218             no strict 'refs';
2219             unshift @{"$class\::ISA"}, $plugin;
2220         }
2221         return $class;
2222     }
2223
2224     sub setup_plugins {
2225         my ( $class, $plugins ) = @_;
2226
2227         $class->_plugins( {} ) unless $class->_plugins;
2228         $plugins ||= [];
2229         for my $plugin ( reverse @$plugins ) {
2230
2231             unless ( $plugin =~ s/\A\+// ) {
2232                 $plugin = "Catalyst::Plugin::$plugin";
2233             }
2234
2235             $class->_register_plugin($plugin);
2236         }
2237     }
2238 }
2239
2240 =head2 $c->stack
2241
2242 Returns an arrayref of the internal execution stack (actions that are
2243 currently executing).
2244
2245 =head2 $c->stats_class
2246
2247 Returns or sets the stats (timing statistics) class.
2248
2249 =head2 $c->use_stats
2250
2251 Returns 1 when stats collection is enabled.  Stats collection is enabled
2252 when the -Stats options is set, debug is on or when the <MYAPP>_STATS
2253 environment variable is set.
2254
2255 Note that this is a static method, not an accessor and should be overloaded
2256 by declaring "sub use_stats { 1 }" in your MyApp.pm, not by calling $c->use_stats(1).
2257
2258 =cut
2259
2260 sub use_stats { 0 }
2261
2262
2263 =head2 $c->write( $data )
2264
2265 Writes $data to the output stream. When using this method directly, you
2266 will need to manually set the C<Content-Length> header to the length of
2267 your output data, if known.
2268
2269 =cut
2270
2271 sub write {
2272     my $c = shift;
2273
2274     # Finalize headers if someone manually writes output
2275     $c->finalize_headers;
2276
2277     return $c->engine->write( $c, @_ );
2278 }
2279
2280 =head2 version
2281
2282 Returns the Catalyst version number. Mostly useful for "powered by"
2283 messages in template systems.
2284
2285 =cut
2286
2287 sub version { return $Catalyst::VERSION }
2288
2289 =head1 INTERNAL ACTIONS
2290
2291 Catalyst uses internal actions like C<_DISPATCH>, C<_BEGIN>, C<_AUTO>,
2292 C<_ACTION>, and C<_END>. These are by default not shown in the private
2293 action table, but you can make them visible with a config parameter.
2294
2295     MyApp->config->{show_internal_actions} = 1;
2296
2297 =head1 CASE SENSITIVITY
2298
2299 By default Catalyst is not case sensitive, so C<MyApp::C::FOO::Bar> is
2300 mapped to C</foo/bar>. You can activate case sensitivity with a config
2301 parameter.
2302
2303     MyApp->config->{case_sensitive} = 1;
2304
2305 This causes C<MyApp::C::Foo::Bar> to map to C</Foo/Bar>.
2306
2307 =head1 ON-DEMAND PARSER
2308
2309 The request body is usually parsed at the beginning of a request,
2310 but if you want to handle input yourself, you can enable on-demand
2311 parsing with a config parameter.
2312
2313     MyApp->config->{parse_on_demand} = 1;
2314     
2315 =head1 PROXY SUPPORT
2316
2317 Many production servers operate using the common double-server approach,
2318 with a lightweight frontend web server passing requests to a larger
2319 backend server. An application running on the backend server must deal
2320 with two problems: the remote user always appears to be C<127.0.0.1> and
2321 the server's hostname will appear to be C<localhost> regardless of the
2322 virtual host that the user connected through.
2323
2324 Catalyst will automatically detect this situation when you are running
2325 the frontend and backend servers on the same machine. The following
2326 changes are made to the request.
2327
2328     $c->req->address is set to the user's real IP address, as read from 
2329     the HTTP X-Forwarded-For header.
2330     
2331     The host value for $c->req->base and $c->req->uri is set to the real
2332     host, as read from the HTTP X-Forwarded-Host header.
2333
2334 Obviously, your web server must support these headers for this to work.
2335
2336 In a more complex server farm environment where you may have your
2337 frontend proxy server(s) on different machines, you will need to set a
2338 configuration option to tell Catalyst to read the proxied data from the
2339 headers.
2340
2341     MyApp->config->{using_frontend_proxy} = 1;
2342     
2343 If you do not wish to use the proxy support at all, you may set:
2344
2345     MyApp->config->{ignore_frontend_proxy} = 1;
2346
2347 =head1 THREAD SAFETY
2348
2349 Catalyst has been tested under Apache 2's threading C<mpm_worker>,
2350 C<mpm_winnt>, and the standalone forking HTTP server on Windows. We
2351 believe the Catalyst core to be thread-safe.
2352
2353 If you plan to operate in a threaded environment, remember that all other
2354 modules you are using must also be thread-safe. Some modules, most notably
2355 L<DBD::SQLite>, are not thread-safe.
2356
2357 =head1 SUPPORT
2358
2359 IRC:
2360
2361     Join #catalyst on irc.perl.org.
2362
2363 Mailing Lists:
2364
2365     http://lists.rawmode.org/mailman/listinfo/catalyst
2366     http://lists.rawmode.org/mailman/listinfo/catalyst-dev
2367
2368 Web:
2369
2370     http://catalyst.perl.org
2371
2372 Wiki:
2373
2374     http://dev.catalyst.perl.org
2375
2376 =head1 SEE ALSO
2377
2378 =head2 L<Task::Catalyst> - All you need to start with Catalyst
2379
2380 =head2 L<Catalyst::Manual> - The Catalyst Manual
2381
2382 =head2 L<Catalyst::Component>, L<Catalyst::Base> - Base classes for components
2383
2384 =head2 L<Catalyst::Engine> - Core engine
2385
2386 =head2 L<Catalyst::Log> - Log class.
2387
2388 =head2 L<Catalyst::Request> - Request object
2389
2390 =head2 L<Catalyst::Response> - Response object
2391
2392 =head2 L<Catalyst::Test> - The test suite.
2393
2394 =head1 CREDITS
2395
2396 Andy Grundman
2397
2398 Andy Wardley
2399
2400 Andreas Marienborg
2401
2402 Andrew Bramble
2403
2404 Andrew Ford
2405
2406 Andrew Ruthven
2407
2408 Arthur Bergman
2409
2410 Autrijus Tang
2411
2412 Brian Cassidy
2413
2414 Carl Franks
2415
2416 Christian Hansen
2417
2418 Christopher Hicks
2419
2420 Dan Sully
2421
2422 Danijel Milicevic
2423
2424 David Kamholz
2425
2426 David Naughton
2427
2428 Drew Taylor
2429
2430 Gary Ashton Jones
2431
2432 Geoff Richards
2433
2434 Jesse Sheidlower
2435
2436 Jesse Vincent
2437
2438 Jody Belka
2439
2440 Johan Lindstrom
2441
2442 Juan Camacho
2443
2444 Leon Brocard
2445
2446 Marcus Ramberg
2447
2448 Matt S Trout
2449
2450 Robert Sedlacek
2451
2452 Sam Vilain
2453
2454 Sascha Kiefer
2455
2456 Sebastian Willert
2457
2458 Tatsuhiko Miyagawa
2459
2460 Ulf Edvinsson
2461
2462 Yuval Kogman
2463
2464 =head1 AUTHOR
2465
2466 Sebastian Riedel, C<sri@oook.de>
2467
2468 =head1 LICENSE
2469
2470 This library is free software, you can redistribute it and/or modify it under
2471 the same terms as Perl itself.
2472
2473 =cut
2474
2475 1;