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