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