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