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