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