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