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