Mad fix.
[catagits/Catalyst-Runtime.git] / lib / Catalyst.pm
1 package Catalyst;
2
3 use Moose;
4 extends 'Catalyst::Component';
5 use Moose::Util qw/find_meta/;
6 use bytes;
7 use Scope::Upper ();
8 use Catalyst::Exception;
9 use Catalyst::Log;
10 use Catalyst::Request;
11 use Catalyst::Request::Upload;
12 use Catalyst::Response;
13 use Catalyst::Utils;
14 use Catalyst::Controller;
15 use Devel::InnerPackage ();
16 use File::stat;
17 use Module::Pluggable::Object ();
18 use Text::SimpleTable ();
19 use Path::Class::Dir ();
20 use Path::Class::File ();
21 use URI ();
22 use URI::http;
23 use URI::https;
24 use Tree::Simple qw/use_weak_refs/;
25 use Tree::Simple::Visitor::FindByUID;
26 use Class::C3::Adopt::NEXT;
27 use attributes;
28 use utf8;
29 use Carp qw/croak carp shortmess/;
30
31 BEGIN { require 5.008001; }
32
33 has stack => (is => 'ro', default => sub { [] });
34 has stash => (is => 'rw', default => sub { {} });
35 has state => (is => 'rw', default => 0);
36 has stats => (is => 'rw');
37 has action => (is => 'rw');
38 has counter => (is => 'rw', default => sub { {} });
39 has request => (is => 'rw', default => sub { $_[0]->request_class->new({}) }, required => 1, lazy => 1);
40 has response => (is => 'rw', default => sub { $_[0]->response_class->new({}) }, required => 1, lazy => 1);
41 has namespace => (is => 'rw');
42
43 sub depth { scalar @{ shift->stack || [] }; }
44 sub comp { shift->component(@_) }
45
46 sub req {
47     my $self = shift; return $self->request(@_);
48 }
49 sub res {
50     my $self = shift; return $self->response(@_);
51 }
52
53 # For backwards compatibility
54 sub finalize_output { shift->finalize_body(@_) };
55
56 # For statistics
57 our $COUNT     = 1;
58 our $START     = time;
59 our $RECURSION = 1000;
60 our $DETACH    = "catalyst_detach\n";
61 our $GO        = "catalyst_go\n";
62
63 #I imagine that very few of these really need to be class variables. if any.
64 #maybe we should just make them attributes with a default?
65 __PACKAGE__->mk_classdata($_)
66   for qw/components arguments dispatcher engine log dispatcher_class
67   engine_class context_class request_class response_class stats_class
68   setup_finished/;
69
70 __PACKAGE__->dispatcher_class('Catalyst::Dispatcher');
71 __PACKAGE__->engine_class('Catalyst::Engine::CGI');
72 __PACKAGE__->request_class('Catalyst::Request');
73 __PACKAGE__->response_class('Catalyst::Response');
74 __PACKAGE__->stats_class('Catalyst::Stats');
75
76 # Remember to update this in Catalyst::Runtime as well!
77
78 our $VERSION = '5.80003';
79
80 {
81     my $dev_version = $VERSION =~ /_\d{2}$/;
82     *_IS_DEVELOPMENT_VERSION = sub () { $dev_version };
83 }
84
85 $VERSION = eval $VERSION;
86
87 sub import {
88     my ( $class, @arguments ) = @_;
89
90     # We have to limit $class to Catalyst to avoid pushing Catalyst upon every
91     # callers @ISA.
92     return unless $class eq 'Catalyst';
93
94     my $caller = caller();
95     return if $caller eq 'main';
96
97     # Kill Adopt::NEXT warnings if we're a non-RC version
98     unless (_IS_DEVELOPMENT_VERSION()) {
99         Class::C3::Adopt::NEXT->unimport(qr/^Catalyst::/);
100     }
101
102     my $meta = Moose::Meta::Class->initialize($caller);
103     #Moose->import({ into => $caller }); #do we want to do this?
104
105     unless ( $caller->isa('Catalyst') ) {
106         my @superclasses = ($meta->superclasses, $class, 'Catalyst::Controller');
107         $meta->superclasses(@superclasses);
108     }
109     unless( $meta->has_method('meta') ){
110         $meta->add_method(meta => sub { Moose::Meta::Class->initialize("${caller}") } );
111     }
112
113     $caller->arguments( [@arguments] );
114     $caller->setup_home;
115 }
116
117 =head1 NAME
118
119 Catalyst - The Elegant MVC Web Application Framework
120
121 =head1 SYNOPSIS
122
123 See the L<Catalyst::Manual> distribution for comprehensive
124 documentation and tutorials.
125
126     # Install Catalyst::Devel for helpers and other development tools
127     # use the helper to create a new application
128     catalyst.pl MyApp
129
130     # add models, views, controllers
131     script/myapp_create.pl model MyDatabase DBIC::Schema create=static dbi:SQLite:/path/to/db
132     script/myapp_create.pl view MyTemplate TT
133     script/myapp_create.pl controller Search
134
135     # built in testserver -- use -r to restart automatically on changes
136     # --help to see all available options
137     script/myapp_server.pl
138
139     # command line testing interface
140     script/myapp_test.pl /yada
141
142     ### in lib/MyApp.pm
143     use Catalyst qw/-Debug/; # include plugins here as well
144
145     ### In lib/MyApp/Controller/Root.pm (autocreated)
146     sub foo : Global { # called for /foo, /foo/1, /foo/1/2, etc.
147         my ( $self, $c, @args ) = @_; # args are qw/1 2/ for /foo/1/2
148         $c->stash->{template} = 'foo.tt'; # set the template
149         # lookup something from db -- stash vars are passed to TT
150         $c->stash->{data} =
151           $c->model('Database::Foo')->search( { country => $args[0] } );
152         if ( $c->req->params->{bar} ) { # access GET or POST parameters
153             $c->forward( 'bar' ); # process another action
154             # do something else after forward returns
155         }
156     }
157
158     # The foo.tt TT template can use the stash data from the database
159     [% WHILE (item = data.next) %]
160         [% item.foo %]
161     [% END %]
162
163     # called for /bar/of/soap, /bar/of/soap/10, etc.
164     sub bar : Path('/bar/of/soap') { ... }
165
166     # called for all actions, from the top-most controller downwards
167     sub auto : Private {
168         my ( $self, $c ) = @_;
169         if ( !$c->user_exists ) { # Catalyst::Plugin::Authentication
170             $c->res->redirect( '/login' ); # require login
171             return 0; # abort request and go immediately to end()
172         }
173         return 1; # success; carry on to next action
174     }
175
176     # called after all actions are finished
177     sub end : Private {
178         my ( $self, $c ) = @_;
179         if ( scalar @{ $c->error } ) { ... } # handle errors
180         return if $c->res->body; # already have a response
181         $c->forward( 'MyApp::View::TT' ); # render template
182     }
183
184     ### in MyApp/Controller/Foo.pm
185     # called for /foo/bar
186     sub bar : Local { ... }
187
188     # called for /blargle
189     sub blargle : Global { ... }
190
191     # an index action matches /foo, but not /foo/1, etc.
192     sub index : Private { ... }
193
194     ### in MyApp/Controller/Foo/Bar.pm
195     # called for /foo/bar/baz
196     sub baz : Local { ... }
197
198     # first Root auto is called, then Foo auto, then this
199     sub auto : Private { ... }
200
201     # powerful regular expression paths are also possible
202     sub details : Regex('^product/(\w+)/details$') {
203         my ( $self, $c ) = @_;
204         # extract the (\w+) from the URI
205         my $product = $c->req->captures->[0];
206     }
207
208 See L<Catalyst::Manual::Intro> for additional information.
209
210 =head1 DESCRIPTION
211
212 Catalyst is a modern framework for making web applications without the
213 pain usually associated with this process. This document is a reference
214 to the main Catalyst application. If you are a new user, we suggest you
215 start with L<Catalyst::Manual::Tutorial> or L<Catalyst::Manual::Intro>.
216
217 See L<Catalyst::Manual> for more documentation.
218
219 Catalyst plugins can be loaded by naming them as arguments to the "use
220 Catalyst" statement. Omit the C<Catalyst::Plugin::> prefix from the
221 plugin name, i.e., C<Catalyst::Plugin::My::Module> becomes
222 C<My::Module>.
223
224     use Catalyst qw/My::Module/;
225
226 If your plugin starts with a name other than C<Catalyst::Plugin::>, you can
227 fully qualify the name by using a unary plus:
228
229     use Catalyst qw/
230         My::Module
231         +Fully::Qualified::Plugin::Name
232     /;
233
234 Special flags like C<-Debug> and C<-Engine> can also be specified as
235 arguments when Catalyst is loaded:
236
237     use Catalyst qw/-Debug My::Module/;
238
239 The position of plugins and flags in the chain is important, because
240 they are loaded in the order in which they appear.
241
242 The following flags are supported:
243
244 =head2 -Debug
245
246 Enables debug output. You can also force this setting from the system
247 environment with CATALYST_DEBUG or <MYAPP>_DEBUG. The environment
248 settings override the application, with <MYAPP>_DEBUG having the highest
249 priority.
250
251 =head2 -Engine
252
253 Forces Catalyst to use a specific engine. Omit the
254 C<Catalyst::Engine::> prefix of the engine name, i.e.:
255
256     use Catalyst qw/-Engine=CGI/;
257
258 =head2 -Home
259
260 Forces Catalyst to use a specific home directory, e.g.:
261
262     use Catalyst qw[-Home=/usr/mst];
263
264 This can also be done in the shell environment by setting either the
265 C<CATALYST_HOME> environment variable or C<MYAPP_HOME>; where C<MYAPP>
266 is replaced with the uppercased name of your application, any "::" in
267 the name will be replaced with underscores, e.g. MyApp::Web should use
268 MYAPP_WEB_HOME. If both variables are set, the MYAPP_HOME one will be used.
269
270 =head2 -Log
271
272     use Catalyst '-Log=warn,fatal,error';
273
274 Specifies a comma-delimited list of log levels.
275
276 =head2 -Stats
277
278 Enables statistics collection and reporting. You can also force this setting
279 from the system environment with CATALYST_STATS or <MYAPP>_STATS. The
280 environment settings override the application, with <MYAPP>_STATS having the
281 highest priority.
282
283 e.g.
284
285    use Catalyst qw/-Stats=1/
286
287 =head1 METHODS
288
289 =head2 INFORMATION ABOUT THE CURRENT REQUEST
290
291 =head2 $c->action
292
293 Returns a L<Catalyst::Action> object for the current action, which
294 stringifies to the action name. See L<Catalyst::Action>.
295
296 =head2 $c->namespace
297
298 Returns the namespace of the current action, i.e., the URI prefix
299 corresponding to the controller of the current action. For example:
300
301     # in Controller::Foo::Bar
302     $c->namespace; # returns 'foo/bar';
303
304 =head2 $c->request
305
306 =head2 $c->req
307
308 Returns the current L<Catalyst::Request> object, giving access to
309 information about the current client request (including parameters,
310 cookies, HTTP headers, etc.). See L<Catalyst::Request>.
311
312 =head2 REQUEST FLOW HANDLING
313
314 =head2 $c->forward( $action [, \@arguments ] )
315
316 =head2 $c->forward( $class, $method, [, \@arguments ] )
317
318 Forwards processing to another action, by its private name. If you give a
319 class name but no method, C<process()> is called. You may also optionally
320 pass arguments in an arrayref. The action will receive the arguments in
321 C<@_> and C<< $c->req->args >>. Upon returning from the function,
322 C<< $c->req->args >> will be restored to the previous values.
323
324 Any data C<return>ed from the action forwarded to, will be returned by the
325 call to forward.
326
327     my $foodata = $c->forward('/foo');
328     $c->forward('index');
329     $c->forward(qw/MyApp::Model::DBIC::Foo do_stuff/);
330     $c->forward('MyApp::View::TT');
331
332 Note that forward implies an C<<eval { }>> around the call (actually
333 C<execute> does), thus de-fatalizing all 'dies' within the called
334 action. If you want C<die> to propagate you need to do something like:
335
336     $c->forward('foo');
337     die $c->error if $c->error;
338
339 Or make sure to always return true values from your actions and write
340 your code like this:
341
342     $c->forward('foo') || return;
343
344 =cut
345
346 sub forward { my $c = shift; no warnings 'recursion'; $c->dispatcher->forward( $c, @_ ) }
347
348 =head2 $c->detach( $action [, \@arguments ] )
349
350 =head2 $c->detach( $class, $method, [, \@arguments ] )
351
352 =head2 $c->detach()
353
354 The same as C<forward>, but doesn't return to the previous action when
355 processing is finished.
356
357 When called with no arguments it escapes the processing chain entirely.
358
359 =cut
360
361 sub detach { my $c = shift; $c->dispatcher->detach( $c, @_ ) }
362
363 =head2 $c->visit( $action [, \@captures, \@arguments ] )
364
365 =head2 $c->visit( $class, $method, [, \@captures, \@arguments ] )
366
367 Almost the same as C<forward>, but does a full dispatch, instead of just
368 calling the new C<$action> / C<$class-E<gt>$method>. This means that C<begin>,
369 C<auto> and the method you go to are called, just like a new request.
370
371 In addition both C<< $c->action >> and C<< $c->namespace >> are localized.
372 This means, for example, that $c->action methods such as C<name>, C<class> and
373 C<reverse> return information for the visited action when they are invoked
374 within the visited action.  This is different from the behavior of C<forward>
375 which continues to use the $c->action object from the caller action even when
376 invoked from the callee.
377
378 C<$c-E<gt>stash> is kept unchanged.
379
380 In effect, C<visit> allows you to "wrap" another action, just as it
381 would have been called by dispatching from a URL, while the analogous
382 C<go> allows you to transfer control to another action as if it had
383 been reached directly from a URL.
384
385 =cut
386
387 sub visit { my $c = shift; $c->dispatcher->visit( $c, @_ ) }
388
389 =head2 $c->go( $action [, \@captures, \@arguments ] )
390
391 =head2 $c->go( $class, $method, [, \@captures, \@arguments ] )
392
393 Almost the same as C<detach>, but does a full dispatch like C<visit>,
394 instead of just calling the new C<$action> /
395 C<$class-E<gt>$method>. This means that C<begin>, C<auto> and the
396 method you visit are called, just like a new request.
397
398 C<$c-E<gt>stash> is kept unchanged.
399
400 =cut
401
402 sub go { my $c = shift; $c->dispatcher->go( $c, @_ ) }
403
404 =head2 $c->response
405
406 =head2 $c->res
407
408 Returns the current L<Catalyst::Response> object, see there for details.
409
410 =head2 $c->stash
411
412 Returns a hashref to the stash, which may be used to store data and pass
413 it between components during a request. You can also set hash keys by
414 passing arguments. The stash is automatically sent to the view. The
415 stash is cleared at the end of a request; it cannot be used for
416 persistent storage (for this you must use a session; see
417 L<Catalyst::Plugin::Session> for a complete system integrated with
418 Catalyst).
419
420     $c->stash->{foo} = $bar;
421     $c->stash( { moose => 'majestic', qux => 0 } );
422     $c->stash( bar => 1, gorch => 2 ); # equivalent to passing a hashref
423
424     # stash is automatically passed to the view for use in a template
425     $c->forward( 'MyApp::View::TT' );
426
427 =cut
428
429 around stash => sub {
430     my $orig = shift;
431     my $c = shift;
432     my $stash = $orig->($c);
433     if (@_) {
434         my $new_stash = @_ > 1 ? {@_} : $_[0];
435         croak('stash takes a hash or hashref') unless ref $new_stash;
436         foreach my $key ( keys %$new_stash ) {
437           $stash->{$key} = $new_stash->{$key};
438         }
439     }
440
441     return $stash;
442 };
443
444
445 =head2 $c->error
446
447 =head2 $c->error($error, ...)
448
449 =head2 $c->error($arrayref)
450
451 Returns an arrayref containing error messages.  If Catalyst encounters an
452 error while processing a request, it stores the error in $c->error.  This
453 method should only be used to store fatal error messages.
454
455     my @error = @{ $c->error };
456
457 Add a new error.
458
459     $c->error('Something bad happened');
460
461 =cut
462
463 sub error {
464     my $c = shift;
465     if ( $_[0] ) {
466         my $error = ref $_[0] eq 'ARRAY' ? $_[0] : [@_];
467         croak @$error unless ref $c;
468         push @{ $c->{error} }, @$error;
469     }
470     elsif ( defined $_[0] ) { $c->{error} = undef }
471     return $c->{error} || [];
472 }
473
474
475 =head2 $c->state
476
477 Contains the return value of the last executed action.
478
479 =head2 $c->clear_errors
480
481 Clear errors.  You probably don't want to clear the errors unless you are
482 implementing a custom error screen.
483
484 This is equivalent to running
485
486     $c->error(0);
487
488 =cut
489
490 sub clear_errors {
491     my $c = shift;
492     $c->error(0);
493 }
494
495 # search components given a name and some prefixes
496 sub _comp_search_prefixes {
497     my ( $c, $name, @prefixes ) = @_;
498     my $appclass = ref $c || $c;
499     my $filter   = "^${appclass}::(" . join( '|', @prefixes ) . ')::';
500     $filter = qr/$filter/; # Compile regex now rather than once per loop
501
502     # map the original component name to the sub part that we will search against
503     my %eligible = map { my $n = $_; $n =~ s{^$appclass\::[^:]+::}{}; $_ => $n; }
504         grep { /$filter/ } keys %{ $c->components };
505
506     # undef for a name will return all
507     return keys %eligible if !defined $name;
508
509     my $query  = ref $name ? $name : qr/^$name$/i;
510     my @result = grep { $eligible{$_} =~ m{$query} } keys %eligible;
511
512     return map { $c->components->{ $_ } } @result if @result;
513
514     # if we were given a regexp to search against, we're done.
515     return if ref $name;
516
517     # regexp fallback
518     $query  = qr/$name/i;
519     @result = map { $c->components->{ $_ } } grep { $eligible{ $_ } =~ m{$query} } keys %eligible;
520
521     # no results? try against full names
522     if( !@result ) {
523         @result = map { $c->components->{ $_ } } grep { m{$query} } keys %eligible;
524     }
525
526     # don't warn if we didn't find any results, it just might not exist
527     if( @result ) {
528         # Disgusting hack to work out correct method name
529         my $warn_for = lc $prefixes[0];
530         my $msg = "Used regexp fallback for \$c->${warn_for}('${name}'), which found '" .
531            (join '", "', @result) . "'. Relying on regexp fallback behavior for " .
532            "component resolution is unreliable and unsafe.";
533         my $short = $result[0];
534         $short =~ s/.*?Model:://;
535         my $shortmess = Carp::shortmess('');
536         if ($shortmess =~ m#Catalyst/Plugin#) {
537            $msg .= " You probably need to set '$short' instead of '${name}' in this " .
538               "plugin's config";
539         } elsif ($shortmess =~ m#Catalyst/lib/(View|Controller)#) {
540            $msg .= " You probably need to set '$short' instead of '${name}' in this " .
541               "component's config";
542         } else {
543            $msg .= " You probably meant \$c->${warn_for}('$short') instead of \$c->${warn_for}({'${name}'}), " .
544               "but if you really wanted to search, pass in a regexp as the argument " .
545               "like so: \$c->${warn_for}(qr/${name}/)";
546         }
547         $c->log->warn( "${msg}$shortmess" );
548     }
549
550     return @result;
551 }
552
553 # Find possible names for a prefix
554 sub _comp_names {
555     my ( $c, @prefixes ) = @_;
556     my $appclass = ref $c || $c;
557
558     my $filter = "^${appclass}::(" . join( '|', @prefixes ) . ')::';
559
560     my @names = map { s{$filter}{}; $_; } $c->_comp_search_prefixes( undef, @prefixes );
561     return @names;
562 }
563
564 # Filter a component before returning by calling ACCEPT_CONTEXT if available
565 sub _filter_component {
566     my ( $c, $comp, @args ) = @_;
567
568     if ( eval { $comp->can('ACCEPT_CONTEXT'); } ) {
569         return $comp->ACCEPT_CONTEXT( $c, @args );
570     }
571
572     return $comp;
573 }
574
575 =head2 COMPONENT ACCESSORS
576
577 =head2 $c->controller($name)
578
579 Gets a L<Catalyst::Controller> instance by name.
580
581     $c->controller('Foo')->do_stuff;
582
583 If the name is omitted, will return the controller for the dispatched
584 action.
585
586 If you want to search for controllers, pass in a regexp as the argument.
587
588     # find all controllers that start with Foo
589     my @foo_controllers = $c->controller(qr{^Foo});
590
591
592 =cut
593
594 sub controller {
595     my ( $c, $name, @args ) = @_;
596
597     if( $name ) {
598         my @result = $c->_comp_search_prefixes( $name, qw/Controller C/ );
599         return map { $c->_filter_component( $_, @args ) } @result if ref $name;
600         return $c->_filter_component( $result[ 0 ], @args );
601     }
602
603     return $c->component( $c->action->class );
604 }
605
606 =head2 $c->model($name)
607
608 Gets a L<Catalyst::Model> instance by name.
609
610     $c->model('Foo')->do_stuff;
611
612 Any extra arguments are directly passed to ACCEPT_CONTEXT.
613
614 If the name is omitted, it will look for
615  - a model object in $c->stash->{current_model_instance}, then
616  - a model name in $c->stash->{current_model}, then
617  - a config setting 'default_model', or
618  - check if there is only one model, and return it if that's the case.
619
620 If you want to search for models, pass in a regexp as the argument.
621
622     # find all models that start with Foo
623     my @foo_models = $c->model(qr{^Foo});
624
625 =cut
626
627 sub model {
628     my ( $c, $name, @args ) = @_;
629
630     if( $name ) {
631         my @result = $c->_comp_search_prefixes( $name, qw/Model M/ );
632         return map { $c->_filter_component( $_, @args ) } @result if ref $name;
633         return $c->_filter_component( $result[ 0 ], @args );
634     }
635
636     if (ref $c) {
637         return $c->stash->{current_model_instance}
638           if $c->stash->{current_model_instance};
639         return $c->model( $c->stash->{current_model} )
640           if $c->stash->{current_model};
641     }
642     return $c->model( $c->config->{default_model} )
643       if $c->config->{default_model};
644
645     my( $comp, $rest ) = $c->_comp_search_prefixes( undef, qw/Model M/);
646
647     if( $rest ) {
648         $c->log->warn( Carp::shortmess('Calling $c->model() will return a random model unless you specify one of:') );
649         $c->log->warn( '* $c->config->{default_model} # the name of the default model to use' );
650         $c->log->warn( '* $c->stash->{current_model} # the name of the model to use for this request' );
651         $c->log->warn( '* $c->stash->{current_model_instance} # the instance of the model to use for this request' );
652         $c->log->warn( 'NB: in version 5.81, the "random" behavior will not work at all.' );
653     }
654
655     return $c->_filter_component( $comp );
656 }
657
658
659 =head2 $c->view($name)
660
661 Gets a L<Catalyst::View> instance by name.
662
663     $c->view('Foo')->do_stuff;
664
665 Any extra arguments are directly passed to ACCEPT_CONTEXT.
666
667 If the name is omitted, it will look for
668  - a view object in $c->stash->{current_view_instance}, then
669  - a view name in $c->stash->{current_view}, then
670  - a config setting 'default_view', or
671  - check if there is only one view, and return it if that's the case.
672
673 If you want to search for views, pass in a regexp as the argument.
674
675     # find all views that start with Foo
676     my @foo_views = $c->view(qr{^Foo});
677
678 =cut
679
680 sub view {
681     my ( $c, $name, @args ) = @_;
682
683     if( $name ) {
684         my @result = $c->_comp_search_prefixes( $name, qw/View V/ );
685         return map { $c->_filter_component( $_, @args ) } @result if ref $name;
686         return $c->_filter_component( $result[ 0 ], @args );
687     }
688
689     if (ref $c) {
690         return $c->stash->{current_view_instance}
691           if $c->stash->{current_view_instance};
692         return $c->view( $c->stash->{current_view} )
693           if $c->stash->{current_view};
694     }
695     return $c->view( $c->config->{default_view} )
696       if $c->config->{default_view};
697
698     my( $comp, $rest ) = $c->_comp_search_prefixes( undef, qw/View V/);
699
700     if( $rest ) {
701         $c->log->warn( 'Calling $c->view() will return a random view unless you specify one of:' );
702         $c->log->warn( '* $c->config->{default_view} # the name of the default view to use' );
703         $c->log->warn( '* $c->stash->{current_view} # the name of the view to use for this request' );
704         $c->log->warn( '* $c->stash->{current_view_instance} # the instance of the view to use for this request' );
705         $c->log->warn( 'NB: in version 5.81, the "random" behavior will not work at all.' );
706     }
707
708     return $c->_filter_component( $comp );
709 }
710
711 =head2 $c->controllers
712
713 Returns the available names which can be passed to $c->controller
714
715 =cut
716
717 sub controllers {
718     my ( $c ) = @_;
719     return $c->_comp_names(qw/Controller C/);
720 }
721
722 =head2 $c->models
723
724 Returns the available names which can be passed to $c->model
725
726 =cut
727
728 sub models {
729     my ( $c ) = @_;
730     return $c->_comp_names(qw/Model M/);
731 }
732
733
734 =head2 $c->views
735
736 Returns the available names which can be passed to $c->view
737
738 =cut
739
740 sub views {
741     my ( $c ) = @_;
742     return $c->_comp_names(qw/View V/);
743 }
744
745 =head2 $c->comp($name)
746
747 =head2 $c->component($name)
748
749 Gets a component object by name. This method is not recommended,
750 unless you want to get a specific component by full
751 class. C<< $c->controller >>, C<< $c->model >>, and C<< $c->view >>
752 should be used instead.
753
754 If C<$name> is a regexp, a list of components matched against the full
755 component name will be returned.
756
757 =cut
758
759 sub component {
760     my ( $c, $name, @args ) = @_;
761
762     if( $name ) {
763         my $comps = $c->components;
764
765         if( !ref $name ) {
766             # is it the exact name?
767             return $c->_filter_component( $comps->{ $name }, @args )
768                        if exists $comps->{ $name };
769
770             # perhaps we just omitted "MyApp"?
771             my $composed = ( ref $c || $c ) . "::${name}";
772             return $c->_filter_component( $comps->{ $composed }, @args )
773                        if exists $comps->{ $composed };
774
775             # search all of the models, views and controllers
776             my( $comp ) = $c->_comp_search_prefixes( $name, qw/Model M Controller C View V/ );
777             return $c->_filter_component( $comp, @args ) if $comp;
778         }
779
780         # This is here so $c->comp( '::M::' ) works
781         my $query = ref $name ? $name : qr{$name}i;
782
783         my @result = grep { m{$query} } keys %{ $c->components };
784         return map { $c->_filter_component( $_, @args ) } @result if ref $name;
785
786         if( $result[ 0 ] ) {
787             $c->log->warn( Carp::shortmess(qq(Found results for "${name}" using regexp fallback)) );
788             $c->log->warn( 'Relying on the regexp fallback behavior for component resolution' );
789             $c->log->warn( 'is unreliable and unsafe. You have been warned' );
790             return $c->_filter_component( $result[ 0 ], @args );
791         }
792
793         # I would expect to return an empty list here, but that breaks back-compat
794     }
795
796     # fallback
797     return sort keys %{ $c->components };
798 }
799
800 =head2 CLASS DATA AND HELPER CLASSES
801
802 =head2 $c->config
803
804 Returns or takes a hashref containing the application's configuration.
805
806     __PACKAGE__->config( { db => 'dsn:SQLite:foo.db' } );
807
808 You can also use a C<YAML>, C<XML> or C<Config::General> config file
809 like myapp.conf in your applications home directory. See
810 L<Catalyst::Plugin::ConfigLoader>.
811
812 =head3 Cascading configuration.
813
814 The config method is present on all Catalyst components, and configuration
815 will be merged when an application is started. Configuration loaded with
816 L<Catalyst::Plugin::ConfigLoader> takes precedence over other configuration,
817 followed by configuration in your top level C<MyApp> class. These two
818 configurations are merged, and then configuration data whose hash key matches a
819 component name is merged with configuration for that component.
820
821 The configuration for a component is then passed to the C<new> method when a
822 component is constructed.
823
824 For example:
825
826     MyApp->config({ 'Model::Foo' => { bar => 'baz', overrides => 'me' } });
827     MyApp::Model::Foo->config({ quux => 'frob', 'overrides => 'this' });
828
829 will mean that C<MyApp::Model::Foo> receives the following data when
830 constructed:
831
832     MyApp::Model::Foo->new({
833         bar => 'baz',
834         quux => 'frob',
835         overrides => 'me',
836     });
837
838 =cut
839
840 around config => sub {
841     my $orig = shift;
842     my $c = shift;
843
844     croak('Setting config after setup has been run is not allowed.')
845         if ( @_ and $c->setup_finished );
846
847     $c->$orig(@_);
848 };
849
850 =head2 $c->log
851
852 Returns the logging object instance. Unless it is already set, Catalyst
853 sets this up with a L<Catalyst::Log> object. To use your own log class,
854 set the logger with the C<< __PACKAGE__->log >> method prior to calling
855 C<< __PACKAGE__->setup >>.
856
857  __PACKAGE__->log( MyLogger->new );
858  __PACKAGE__->setup;
859
860 And later:
861
862     $c->log->info( 'Now logging with my own logger!' );
863
864 Your log class should implement the methods described in
865 L<Catalyst::Log>.
866
867
868 =head2 $c->debug
869
870 Returns 1 if debug mode is enabled, 0 otherwise.
871
872 You can enable debug mode in several ways:
873
874 =over
875
876 =item By calling myapp_server.pl with the -d flag
877
878 =item With the environment variables MYAPP_DEBUG, or CATALYST_DEBUG
879
880 =item The -Debug option in your MyApp.pm
881
882 =item By declaring C<sub debug { 1 }> in your MyApp.pm.
883
884 =back
885
886 Calling C<< $c->debug(1) >> has no effect.
887
888 =cut
889
890 sub debug { 0 }
891
892 =head2 $c->dispatcher
893
894 Returns the dispatcher instance. See L<Catalyst::Dispatcher>.
895
896 =head2 $c->engine
897
898 Returns the engine instance. See L<Catalyst::Engine>.
899
900
901 =head2 UTILITY METHODS
902
903 =head2 $c->path_to(@path)
904
905 Merges C<@path> with C<< $c->config->{home} >> and returns a
906 L<Path::Class::Dir> object.
907
908 For example:
909
910     $c->path_to( 'db', 'sqlite.db' );
911
912 =cut
913
914 sub path_to {
915     my ( $c, @path ) = @_;
916     my $path = Path::Class::Dir->new( $c->config->{home}, @path );
917     if ( -d $path ) { return $path }
918     else { return Path::Class::File->new( $c->config->{home}, @path ) }
919 }
920
921 =head2 $c->plugin( $name, $class, @args )
922
923 Helper method for plugins. It creates a class data accessor/mutator and
924 loads and instantiates the given class.
925
926     MyApp->plugin( 'prototype', 'HTML::Prototype' );
927
928     $c->prototype->define_javascript_functions;
929
930 B<Note:> This method of adding plugins is deprecated. The ability
931 to add plugins like this B<will be removed> in a Catalyst 5.81.
932 Please do not use this functionality in new code.
933
934 =cut
935
936 sub plugin {
937     my ( $class, $name, $plugin, @args ) = @_;
938
939     # See block comment in t/unit_core_plugin.t
940     $class->log->warn(qq/Adding plugin using the ->plugin method is deprecated, and will be removed in Catalyst 5.81/);
941
942     $class->_register_plugin( $plugin, 1 );
943
944     eval { $plugin->import };
945     $class->mk_classdata($name);
946     my $obj;
947     eval { $obj = $plugin->new(@args) };
948
949     if ($@) {
950         Catalyst::Exception->throw( message =>
951               qq/Couldn't instantiate instant plugin "$plugin", "$@"/ );
952     }
953
954     $class->$name($obj);
955     $class->log->debug(qq/Initialized instant plugin "$plugin" as "$name"/)
956       if $class->debug;
957 }
958
959 =head2 MyApp->setup
960
961 Initializes the dispatcher and engine, loads any plugins, and loads the
962 model, view, and controller components. You may also specify an array
963 of plugins to load here, if you choose to not load them in the C<use
964 Catalyst> line.
965
966     MyApp->setup;
967     MyApp->setup( qw/-Debug/ );
968
969 =cut
970
971 sub setup {
972     my ( $class, @arguments ) = @_;
973     croak('Running setup more than once')
974         if ( $class->setup_finished );
975
976     unless ( $class->isa('Catalyst') ) {
977
978         Catalyst::Exception->throw(
979             message => qq/'$class' does not inherit from Catalyst/ );
980     }
981
982     if ( $class->arguments ) {
983         @arguments = ( @arguments, @{ $class->arguments } );
984     }
985
986     # Process options
987     my $flags = {};
988
989     foreach (@arguments) {
990
991         if (/^-Debug$/) {
992             $flags->{log} =
993               ( $flags->{log} ) ? 'debug,' . $flags->{log} : 'debug';
994         }
995         elsif (/^-(\w+)=?(.*)$/) {
996             $flags->{ lc $1 } = $2;
997         }
998         else {
999             push @{ $flags->{plugins} }, $_;
1000         }
1001     }
1002
1003     $class->setup_home( delete $flags->{home} );
1004
1005     $class->setup_log( delete $flags->{log} );
1006     $class->setup_plugins( delete $flags->{plugins} );
1007     $class->setup_dispatcher( delete $flags->{dispatcher} );
1008     $class->setup_engine( delete $flags->{engine} );
1009     $class->setup_stats( delete $flags->{stats} );
1010
1011     for my $flag ( sort keys %{$flags} ) {
1012
1013         if ( my $code = $class->can( 'setup_' . $flag ) ) {
1014             &$code( $class, delete $flags->{$flag} );
1015         }
1016         else {
1017             $class->log->warn(qq/Unknown flag "$flag"/);
1018         }
1019     }
1020
1021     eval { require Catalyst::Devel; };
1022     if( !$@ && $ENV{CATALYST_SCRIPT_GEN} && ( $ENV{CATALYST_SCRIPT_GEN} < $Catalyst::Devel::CATALYST_SCRIPT_GEN ) ) {
1023         $class->log->warn(<<"EOF");
1024 You are running an old script!
1025
1026   Please update by running (this will overwrite existing files):
1027     catalyst.pl -force -scripts $class
1028
1029   or (this will not overwrite existing files):
1030     catalyst.pl -scripts $class
1031
1032 EOF
1033     }
1034
1035     if ( $class->debug ) {
1036         my @plugins = map { "$_  " . ( $_->VERSION || '' ) } $class->registered_plugins;
1037
1038         if (@plugins) {
1039             my $column_width = Catalyst::Utils::term_width() - 6;
1040             my $t = Text::SimpleTable->new($column_width);
1041             $t->row($_) for @plugins;
1042             $class->log->debug( "Loaded plugins:\n" . $t->draw . "\n" );
1043         }
1044
1045         my $dispatcher = $class->dispatcher;
1046         my $engine     = $class->engine;
1047         my $home       = $class->config->{home};
1048
1049         $class->log->debug(sprintf(q/Loaded dispatcher "%s"/, blessed($dispatcher)));
1050         $class->log->debug(sprintf(q/Loaded engine "%s"/, blessed($engine)));
1051
1052         $home
1053           ? ( -d $home )
1054           ? $class->log->debug(qq/Found home "$home"/)
1055           : $class->log->debug(qq/Home "$home" doesn't exist/)
1056           : $class->log->debug(q/Couldn't find home/);
1057     }
1058
1059     # Call plugins setup, this is stupid and evil.
1060     # Also screws C3 badly on 5.10, hack to avoid.
1061     {
1062         no warnings qw/redefine/;
1063         local *setup = sub { };
1064         $class->setup unless $Catalyst::__AM_RESTARTING;
1065     }
1066
1067     # Initialize our data structure
1068     $class->components( {} );
1069
1070     $class->setup_components;
1071
1072     if ( $class->debug ) {
1073         my $column_width = Catalyst::Utils::term_width() - 8 - 9;
1074         my $t = Text::SimpleTable->new( [ $column_width, 'Class' ], [ 8, 'Type' ] );
1075         for my $comp ( sort keys %{ $class->components } ) {
1076             my $type = ref $class->components->{$comp} ? 'instance' : 'class';
1077             $t->row( $comp, $type );
1078         }
1079         $class->log->debug( "Loaded components:\n" . $t->draw . "\n" )
1080           if ( keys %{ $class->components } );
1081     }
1082
1083     # Add our self to components, since we are also a component
1084     if( $class->isa('Catalyst::Controller') ){
1085       $class->components->{$class} = $class;
1086     }
1087
1088     $class->setup_actions;
1089
1090     if ( $class->debug ) {
1091         my $name = $class->config->{name} || 'Application';
1092         $class->log->info("$name powered by Catalyst $Catalyst::VERSION");
1093     }
1094     $class->log->_flush() if $class->log->can('_flush');
1095
1096     # Make sure that the application class becomes immutable at this point,
1097     # which ensures that it gets an inlined constructor. This means that it
1098     # works even if the user has added a plugin which contains a new method.
1099     # Note however that we have to do the work on scope end, so that method
1100     # modifiers work correctly in MyApp (as you have to call setup _before_
1101     # applying modifiers).
1102     Scope::Upper::reap(sub {
1103         die $@ if $@; # This does not appear to do what you think it does.
1104         my $meta = Class::MOP::get_metaclass_by_name($class);
1105         if ( $meta->is_immutable && ! { $meta->immutable_options }->{inline_constructor} ) {
1106             die "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     }, Scope::Upper::SCOPE(1));
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/([^$URI::uric])/$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->init_meta( for_class => $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 sky: Arthur Bergman
2753
2754 the_jester: Jesse Sheidlower
2755
2756 t0m: Tomas Doran <bobtfish@bobtfish.net>
2757
2758 Ulf Edvinsson
2759
2760 willert: Sebastian Willert <willert@cpan.org>
2761
2762 =head1 LICENSE
2763
2764 This library is free software, you can redistribute it and/or modify it under
2765 the same terms as Perl itself.
2766
2767 =cut
2768
2769 no Moose;
2770
2771 __PACKAGE__->meta->make_immutable;
2772
2773 1;