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