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