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