remove tabs that stats patch added
[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.7011';
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 Instead of C<$path>, you can also optionally pass a C<$action> object
924 which will be resolved to a path using
925 C<< $c->dispatcher->uri_for_action >>; if the first element of
926 C<@args> is an arrayref it is treated as a list of captures to be passed
927 to C<uri_for_action>.
928
929 =cut
930
931 sub uri_for {
932     my ( $c, $path, @args ) = @_;
933
934     if ( Scalar::Util::blessed($path) ) { # action object
935         my $captures = ( scalar @args && ref $args[0] eq 'ARRAY'
936                          ? shift(@args)
937                          : [] );
938         $path = $c->dispatcher->uri_for_action($path, $captures);
939         return undef unless defined($path);
940         $path = '/' if $path eq '';
941     }
942
943     undef($path) if (defined $path && $path eq '');
944
945     my $params =
946       ( scalar @args && ref $args[$#args] eq 'HASH' ? pop @args : {} );
947
948     carp "uri_for called with undef argument" if grep { ! defined $_ } @args;
949     s/([^$URI::uric])/$URI::Escape::escapes{$1}/go for @args;
950
951     unshift(@args, $path);
952
953     unless (defined $path && $path =~ s!^/!!) { # in-place strip
954         my $namespace = $c->namespace;
955         if (defined $path) { # cheesy hack to handle path '../foo'
956            $namespace =~ s{(?:^|/)[^/]+$}{} while $args[0] =~ s{^\.\./}{};
957         }
958         unshift(@args, $namespace || '');
959     }
960     
961     # join args with '/', or a blank string
962     my $args = join('/', grep { defined($_) } @args);
963     $args =~ s/\?/%3F/g; # STUPID STUPID SPECIAL CASE
964     $args =~ s!^/!!;
965     my $base = $c->req->base;
966     my $class = ref($base);
967     $base =~ s{(?<!/)$}{/};
968
969     my $query = '';
970
971     if (my @keys = keys %$params) {
972       # somewhat lifted from URI::_query's query_form
973       $query = '?'.join('&', map {
974           s/([;\/?:@&=+,\$\[\]%])/$URI::Escape::escapes{$1}/go;
975           s/ /+/g;
976           my $key = $_;
977           my $val = $params->{$_};
978           $val = '' unless defined $val;
979           (map {
980               $_ = "$_";
981               utf8::encode( $_ );
982               # using the URI::Escape pattern here so utf8 chars survive
983               s/([^A-Za-z0-9\-_.!~*'() ])/$URI::Escape::escapes{$1}/go;
984               s/ /+/g;
985               "${key}=$_"; } ( ref $val eq 'ARRAY' ? @$val : $val ));
986       } @keys);
987     }
988
989     my $res = bless(\"${base}${args}${query}", $class);
990     $res;
991 }
992
993 =head2 $c->welcome_message
994
995 Returns the Catalyst welcome HTML page.
996
997 =cut
998
999 sub welcome_message {
1000     my $c      = shift;
1001     my $name   = $c->config->{name};
1002     my $logo   = $c->uri_for('/static/images/catalyst_logo.png');
1003     my $prefix = Catalyst::Utils::appprefix( ref $c );
1004     $c->response->content_type('text/html; charset=utf-8');
1005     return <<"EOF";
1006 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
1007     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
1008 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
1009     <head>
1010     <meta http-equiv="Content-Language" content="en" />
1011     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
1012         <title>$name on Catalyst $VERSION</title>
1013         <style type="text/css">
1014             body {
1015                 color: #000;
1016                 background-color: #eee;
1017             }
1018             div#content {
1019                 width: 640px;
1020                 margin-left: auto;
1021                 margin-right: auto;
1022                 margin-top: 10px;
1023                 margin-bottom: 10px;
1024                 text-align: left;
1025                 background-color: #ccc;
1026                 border: 1px solid #aaa;
1027             }
1028             p, h1, h2 {
1029                 margin-left: 20px;
1030                 margin-right: 20px;
1031                 font-family: verdana, tahoma, sans-serif;
1032             }
1033             a {
1034                 font-family: verdana, tahoma, sans-serif;
1035             }
1036             :link, :visited {
1037                     text-decoration: none;
1038                     color: #b00;
1039                     border-bottom: 1px dotted #bbb;
1040             }
1041             :link:hover, :visited:hover {
1042                     color: #555;
1043             }
1044             div#topbar {
1045                 margin: 0px;
1046             }
1047             pre {
1048                 margin: 10px;
1049                 padding: 8px;
1050             }
1051             div#answers {
1052                 padding: 8px;
1053                 margin: 10px;
1054                 background-color: #fff;
1055                 border: 1px solid #aaa;
1056             }
1057             h1 {
1058                 font-size: 0.9em;
1059                 font-weight: normal;
1060                 text-align: center;
1061             }
1062             h2 {
1063                 font-size: 1.0em;
1064             }
1065             p {
1066                 font-size: 0.9em;
1067             }
1068             p img {
1069                 float: right;
1070                 margin-left: 10px;
1071             }
1072             span#appname {
1073                 font-weight: bold;
1074                 font-size: 1.6em;
1075             }
1076         </style>
1077     </head>
1078     <body>
1079         <div id="content">
1080             <div id="topbar">
1081                 <h1><span id="appname">$name</span> on <a href="http://catalyst.perl.org">Catalyst</a>
1082                     $VERSION</h1>
1083              </div>
1084              <div id="answers">
1085                  <p>
1086                  <img src="$logo" alt="Catalyst Logo" />
1087                  </p>
1088                  <p>Welcome to the  world of Catalyst.
1089                     This <a href="http://en.wikipedia.org/wiki/MVC">MVC</a>
1090                     framework will make web development something you had
1091                     never expected it to be: Fun, rewarding, and quick.</p>
1092                  <h2>What to do now?</h2>
1093                  <p>That really depends  on what <b>you</b> want to do.
1094                     We do, however, provide you with a few starting points.</p>
1095                  <p>If you want to jump right into web development with Catalyst
1096                     you might want want to start with a tutorial.</p>
1097 <pre>perldoc <a href="http://cpansearch.perl.org/dist/Catalyst-Manual/lib/Catalyst/Manual/Tutorial.pod">Catalyst::Manual::Tutorial</a></code>
1098 </pre>
1099 <p>Afterwards you can go on to check out a more complete look at our features.</p>
1100 <pre>
1101 <code>perldoc <a href="http://cpansearch.perl.org/dist/Catalyst-Manual/lib/Catalyst/Manual/Intro.pod">Catalyst::Manual::Intro</a>
1102 <!-- Something else should go here, but the Catalyst::Manual link seems unhelpful -->
1103 </code></pre>
1104                  <h2>What to do next?</h2>
1105                  <p>Next it's time to write an actual application. Use the
1106                     helper scripts to generate <a href="http://cpansearch.perl.org/search?query=Catalyst%3A%3AController%3A%3A&amp;mode=all">controllers</a>,
1107                     <a href="http://cpansearch.perl.org/search?query=Catalyst%3A%3AModel%3A%3A&amp;mode=all">models</a>, and
1108                     <a href="http://cpansearch.perl.org/search?query=Catalyst%3A%3AView%3A%3A&amp;mode=all">views</a>;
1109                     they can save you a lot of work.</p>
1110                     <pre><code>script/${prefix}_create.pl -help</code></pre>
1111                     <p>Also, be sure to check out the vast and growing
1112                     collection of <a href="http://cpansearch.perl.org/search?query=Catalyst%3A%3APlugin%3A%3A&amp;mode=all">plugins for Catalyst on CPAN</a>;
1113                     you are likely to find what you need there.
1114                     </p>
1115
1116                  <h2>Need help?</h2>
1117                  <p>Catalyst has a very active community. Here are the main places to
1118                     get in touch with us.</p>
1119                  <ul>
1120                      <li>
1121                          <a href="http://dev.catalyst.perl.org">Wiki</a>
1122                      </li>
1123                      <li>
1124                          <a href="http://lists.rawmode.org/mailman/listinfo/catalyst">Mailing-List</a>
1125                      </li>
1126                      <li>
1127                          <a href="irc://irc.perl.org/catalyst">IRC channel #catalyst on irc.perl.org</a>
1128                      </li>
1129                  </ul>
1130                  <h2>In conclusion</h2>
1131                  <p>The Catalyst team hopes you will enjoy using Catalyst as much 
1132                     as we enjoyed making it. Please contact us if you have ideas
1133                     for improvement or other feedback.</p>
1134              </div>
1135          </div>
1136     </body>
1137 </html>
1138 EOF
1139 }
1140
1141 =head1 INTERNAL METHODS
1142
1143 These methods are not meant to be used by end users.
1144
1145 =head2 $c->components
1146
1147 Returns a hash of components.
1148
1149 =head2 $c->context_class
1150
1151 Returns or sets the context class.
1152
1153 =head2 $c->counter
1154
1155 Returns a hashref containing coderefs and execution counts (needed for
1156 deep recursion detection).
1157
1158 =head2 $c->depth
1159
1160 Returns the number of actions on the current internal execution stack.
1161
1162 =head2 $c->dispatch
1163
1164 Dispatches a request to actions.
1165
1166 =cut
1167
1168 sub dispatch { my $c = shift; $c->dispatcher->dispatch( $c, @_ ) }
1169
1170 =head2 $c->dispatcher_class
1171
1172 Returns or sets the dispatcher class.
1173
1174 =head2 $c->dump_these
1175
1176 Returns a list of 2-element array references (name, structure) pairs
1177 that will be dumped on the error page in debug mode.
1178
1179 =cut
1180
1181 sub dump_these {
1182     my $c = shift;
1183     [ Request => $c->req ], 
1184     [ Response => $c->res ], 
1185     [ Stash => $c->stash ],
1186     [ Config => $c->config ];
1187 }
1188
1189 =head2 $c->engine_class
1190
1191 Returns or sets the engine class.
1192
1193 =head2 $c->execute( $class, $coderef )
1194
1195 Execute a coderef in given class and catch exceptions. Errors are available
1196 via $c->error.
1197
1198 =cut
1199
1200 sub execute {
1201     my ( $c, $class, $code ) = @_;
1202     $class = $c->component($class) || $class;
1203     $c->state(0);
1204
1205     if ( $c->depth >= $RECURSION ) {
1206         my $action = "$code";
1207         $action = "/$action" unless $action =~ /->/;
1208         my $error = qq/Deep recursion detected calling "$action"/;
1209         $c->log->error($error);
1210         $c->error($error);
1211         $c->state(0);
1212         return $c->state;
1213     }
1214
1215     my $stats_info = $c->_stats_start_execute( $code ) if $c->use_stats;
1216
1217     push( @{ $c->stack }, $code );
1218     
1219     eval { $c->state( &$code( $class, $c, @{ $c->req->args } ) || 0 ) };
1220
1221     $c->_stats_finish_execute( $stats_info ) if $c->use_stats and $stats_info;
1222     
1223     my $last = pop( @{ $c->stack } );
1224
1225     if ( my $error = $@ ) {
1226         if ( !ref($error) and $error eq $DETACH ) { die $DETACH if $c->depth > 1 }
1227         else {
1228             unless ( ref $error ) {
1229                 no warnings 'uninitialized';
1230                 chomp $error;
1231                 my $class = $last->class;
1232                 my $name  = $last->name;
1233                 $error = qq/Caught exception in $class->$name "$error"/;
1234             }
1235             $c->error($error);
1236             $c->state(0);
1237         }
1238     }
1239     return $c->state;
1240 }
1241
1242 sub _stats_start_execute {
1243     my ( $c, $code ) = @_;
1244
1245     return if ( ( $code->name =~ /^_.*/ )
1246         && ( !$c->config->{show_internal_actions} ) );
1247
1248     $c->counter->{"$code"}++;
1249
1250     my $action = "$code";
1251     $action = "/$action" unless $action =~ /->/;
1252
1253     # determine if the call was the result of a forward
1254     # this is done by walking up the call stack and looking for a calling
1255     # sub of Catalyst::forward before the eval
1256     my $callsub = q{};
1257     for my $index ( 2 .. 11 ) {
1258         last
1259         if ( ( caller($index) )[0] eq 'Catalyst'
1260             && ( caller($index) )[3] eq '(eval)' );
1261
1262         if ( ( caller($index) )[3] =~ /forward$/ ) {
1263             $callsub = ( caller($index) )[3];
1264             $action  = "-> $action";
1265             last;
1266         }
1267     }
1268
1269     # is this a root-level call or a forwarded call?
1270     if ( $callsub =~ /forward$/ ) {
1271
1272         # forward, locate the caller
1273         if ( my $parent = $c->stack->[-1] ) {
1274             $c->stats->profile(begin => $action, 
1275                                parent => "$parent" . $c->counter->{"$parent"});
1276         }
1277         else {
1278
1279             # forward with no caller may come from a plugin
1280             $c->stats->profile(begin => $action);
1281         }
1282     }
1283     else {
1284         
1285         # root-level call
1286         $c->stats->profile(begin => $action);
1287     }
1288     return $action;
1289
1290 }
1291
1292 sub _stats_finish_execute {
1293     my ( $c, $info ) = @_;
1294     $c->stats->profile(end => $info);
1295 }
1296
1297 =head2 $c->_localize_fields( sub { }, \%keys );
1298
1299 =cut
1300
1301 sub _localize_fields {
1302     my ( $c, $localized, $code ) = ( @_ );
1303
1304     my $request = delete $localized->{request} || {};
1305     my $response = delete $localized->{response} || {};
1306     
1307     local @{ $c }{ keys %$localized } = values %$localized;
1308     local @{ $c->request }{ keys %$request } = values %$request;
1309     local @{ $c->response }{ keys %$response } = values %$response;
1310
1311     $code->();
1312 }
1313
1314 =head2 $c->finalize
1315
1316 Finalizes the request.
1317
1318 =cut
1319
1320 sub finalize {
1321     my $c = shift;
1322
1323     for my $error ( @{ $c->error } ) {
1324         $c->log->error($error);
1325     }
1326
1327     # Allow engine to handle finalize flow (for POE)
1328     if ( $c->engine->can('finalize') ) {
1329         $c->engine->finalize($c);
1330     }
1331     else {
1332
1333         $c->finalize_uploads;
1334
1335         # Error
1336         if ( $#{ $c->error } >= 0 ) {
1337             $c->finalize_error;
1338         }
1339
1340         $c->finalize_headers;
1341
1342         # HEAD request
1343         if ( $c->request->method eq 'HEAD' ) {
1344             $c->response->body('');
1345         }
1346
1347         $c->finalize_body;
1348     }
1349     
1350     if ($c->use_stats) {        
1351         my $elapsed = sprintf '%f', $c->stats->elapsed;
1352         my $av = $elapsed == 0 ? '??' : sprintf '%.3f', 1 / $elapsed;
1353         $c->log->info(
1354             "Request took ${elapsed}s ($av/s)\n" . $c->stats->report . "\n" );        
1355     }
1356
1357     return $c->response->status;
1358 }
1359
1360 =head2 $c->finalize_body
1361
1362 Finalizes body.
1363
1364 =cut
1365
1366 sub finalize_body { my $c = shift; $c->engine->finalize_body( $c, @_ ) }
1367
1368 =head2 $c->finalize_cookies
1369
1370 Finalizes cookies.
1371
1372 =cut
1373
1374 sub finalize_cookies { my $c = shift; $c->engine->finalize_cookies( $c, @_ ) }
1375
1376 =head2 $c->finalize_error
1377
1378 Finalizes error.
1379
1380 =cut
1381
1382 sub finalize_error { my $c = shift; $c->engine->finalize_error( $c, @_ ) }
1383
1384 =head2 $c->finalize_headers
1385
1386 Finalizes headers.
1387
1388 =cut
1389
1390 sub finalize_headers {
1391     my $c = shift;
1392
1393     # Check if we already finalized headers
1394     return if $c->response->{_finalized_headers};
1395
1396     # Handle redirects
1397     if ( my $location = $c->response->redirect ) {
1398         $c->log->debug(qq/Redirecting to "$location"/) if $c->debug;
1399         $c->response->header( Location => $location );
1400         
1401         if ( !$c->response->body ) {
1402             # Add a default body if none is already present
1403             $c->response->body(
1404                 qq{<html><body><p>This item has moved <a href="$location">here</a>.</p></body></html>}
1405             );
1406         }
1407     }
1408
1409     # Content-Length
1410     if ( $c->response->body && !$c->response->content_length ) {
1411
1412         # get the length from a filehandle
1413         if ( blessed( $c->response->body ) && $c->response->body->can('read') )
1414         {
1415             my $stat = stat $c->response->body;
1416             if ( $stat && $stat->size > 0 ) {
1417                 $c->response->content_length( $stat->size );
1418             }
1419             else {
1420                 $c->log->warn('Serving filehandle without a content-length');
1421             }
1422         }
1423         else {
1424             $c->response->content_length( bytes::length( $c->response->body ) );
1425         }
1426     }
1427
1428     # Errors
1429     if ( $c->response->status =~ /^(1\d\d|[23]04)$/ ) {
1430         $c->response->headers->remove_header("Content-Length");
1431         $c->response->body('');
1432     }
1433
1434     $c->finalize_cookies;
1435
1436     $c->engine->finalize_headers( $c, @_ );
1437
1438     # Done
1439     $c->response->{_finalized_headers} = 1;
1440 }
1441
1442 =head2 $c->finalize_output
1443
1444 An alias for finalize_body.
1445
1446 =head2 $c->finalize_read
1447
1448 Finalizes the input after reading is complete.
1449
1450 =cut
1451
1452 sub finalize_read { my $c = shift; $c->engine->finalize_read( $c, @_ ) }
1453
1454 =head2 $c->finalize_uploads
1455
1456 Finalizes uploads. Cleans up any temporary files.
1457
1458 =cut
1459
1460 sub finalize_uploads { my $c = shift; $c->engine->finalize_uploads( $c, @_ ) }
1461
1462 =head2 $c->get_action( $action, $namespace )
1463
1464 Gets an action in a given namespace.
1465
1466 =cut
1467
1468 sub get_action { my $c = shift; $c->dispatcher->get_action(@_) }
1469
1470 =head2 $c->get_actions( $action, $namespace )
1471
1472 Gets all actions of a given name in a namespace and all parent
1473 namespaces.
1474
1475 =cut
1476
1477 sub get_actions { my $c = shift; $c->dispatcher->get_actions( $c, @_ ) }
1478
1479 =head2 $c->handle_request( $class, @arguments )
1480
1481 Called to handle each HTTP request.
1482
1483 =cut
1484
1485 sub handle_request {
1486     my ( $class, @arguments ) = @_;
1487
1488     # Always expect worst case!
1489     my $status = -1;
1490     eval {
1491         if ($class->debug) {
1492             my $secs = time - $START || 1;
1493             my $av = sprintf '%.3f', $COUNT / $secs;
1494             my $time = localtime time;
1495             $class->log->info("*** Request $COUNT ($av/s) [$$] [$time] ***");
1496         }
1497
1498         my $c = $class->prepare(@arguments);
1499         $c->dispatch;
1500         $status = $c->finalize;   
1501     };
1502
1503     if ( my $error = $@ ) {
1504         chomp $error;
1505         $class->log->error(qq/Caught exception in engine "$error"/);
1506     }
1507
1508     $COUNT++;
1509     $class->log->_flush() if $class->log->can('_flush');
1510     return $status;
1511 }
1512
1513 =head2 $c->prepare( @arguments )
1514
1515 Creates a Catalyst context from an engine-specific request (Apache, CGI,
1516 etc.).
1517
1518 =cut
1519
1520 sub prepare {
1521     my ( $class, @arguments ) = @_;
1522
1523     $class->context_class( ref $class || $class ) unless $class->context_class;
1524     my $c = $class->context_class->new(
1525         {
1526             counter => {},
1527             stack   => [],
1528             request => $class->request_class->new(
1529                 {
1530                     arguments        => [],
1531                     body_parameters  => {},
1532                     cookies          => {},
1533                     headers          => HTTP::Headers->new,
1534                     parameters       => {},
1535                     query_parameters => {},
1536                     secure           => 0,
1537                     captures         => [],
1538                     uploads          => {}
1539                 }
1540             ),
1541             response => $class->response_class->new(
1542                 {
1543                     body    => '',
1544                     cookies => {},
1545                     headers => HTTP::Headers->new(),
1546                     status  => 200
1547                 }
1548             ),
1549             stash => {},
1550             state => 0
1551         }
1552     );
1553
1554     $c->stats($class->stats_class->new)->enable($c->use_stats);
1555     if ( $c->debug ) {
1556         $c->res->headers->header( 'X-Catalyst' => $Catalyst::VERSION );            
1557     }
1558
1559     # For on-demand data
1560     $c->request->{_context}  = $c;
1561     $c->response->{_context} = $c;
1562     weaken( $c->request->{_context} );
1563     weaken( $c->response->{_context} );
1564
1565     # Allow engine to direct the prepare flow (for POE)
1566     if ( $c->engine->can('prepare') ) {
1567         $c->engine->prepare( $c, @arguments );
1568     }
1569     else {
1570         $c->prepare_request(@arguments);
1571         $c->prepare_connection;
1572         $c->prepare_query_parameters;
1573         $c->prepare_headers;
1574         $c->prepare_cookies;
1575         $c->prepare_path;
1576
1577         # Prepare the body for reading, either by prepare_body
1578         # or the user, if they are using $c->read
1579         $c->prepare_read;
1580         
1581         # Parse the body unless the user wants it on-demand
1582         unless ( $c->config->{parse_on_demand} ) {
1583             $c->prepare_body;
1584         }
1585     }
1586
1587     my $method  = $c->req->method  || '';
1588     my $path    = $c->req->path    || '/';
1589     my $address = $c->req->address || '';
1590
1591     $c->log->debug(qq/"$method" request for "$path" from "$address"/)
1592       if $c->debug;
1593
1594     $c->prepare_action;
1595
1596     return $c;
1597 }
1598
1599 =head2 $c->prepare_action
1600
1601 Prepares action. See L<Catalyst::Dispatcher>.
1602
1603 =cut
1604
1605 sub prepare_action { my $c = shift; $c->dispatcher->prepare_action( $c, @_ ) }
1606
1607 =head2 $c->prepare_body
1608
1609 Prepares message body.
1610
1611 =cut
1612
1613 sub prepare_body {
1614     my $c = shift;
1615
1616     # Do we run for the first time?
1617     return if defined $c->request->{_body};
1618
1619     # Initialize on-demand data
1620     $c->engine->prepare_body( $c, @_ );
1621     $c->prepare_parameters;
1622     $c->prepare_uploads;
1623
1624     if ( $c->debug && keys %{ $c->req->body_parameters } ) {
1625         my $t = Text::SimpleTable->new( [ 35, 'Parameter' ], [ 36, 'Value' ] );
1626         for my $key ( sort keys %{ $c->req->body_parameters } ) {
1627             my $param = $c->req->body_parameters->{$key};
1628             my $value = defined($param) ? $param : '';
1629             $t->row( $key,
1630                 ref $value eq 'ARRAY' ? ( join ', ', @$value ) : $value );
1631         }
1632         $c->log->debug( "Body Parameters are:\n" . $t->draw );
1633     }
1634 }
1635
1636 =head2 $c->prepare_body_chunk( $chunk )
1637
1638 Prepares a chunk of data before sending it to L<HTTP::Body>.
1639
1640 See L<Catalyst::Engine>.
1641
1642 =cut
1643
1644 sub prepare_body_chunk {
1645     my $c = shift;
1646     $c->engine->prepare_body_chunk( $c, @_ );
1647 }
1648
1649 =head2 $c->prepare_body_parameters
1650
1651 Prepares body parameters.
1652
1653 =cut
1654
1655 sub prepare_body_parameters {
1656     my $c = shift;
1657     $c->engine->prepare_body_parameters( $c, @_ );
1658 }
1659
1660 =head2 $c->prepare_connection
1661
1662 Prepares connection.
1663
1664 =cut
1665
1666 sub prepare_connection {
1667     my $c = shift;
1668     $c->engine->prepare_connection( $c, @_ );
1669 }
1670
1671 =head2 $c->prepare_cookies
1672
1673 Prepares cookies.
1674
1675 =cut
1676
1677 sub prepare_cookies { my $c = shift; $c->engine->prepare_cookies( $c, @_ ) }
1678
1679 =head2 $c->prepare_headers
1680
1681 Prepares headers.
1682
1683 =cut
1684
1685 sub prepare_headers { my $c = shift; $c->engine->prepare_headers( $c, @_ ) }
1686
1687 =head2 $c->prepare_parameters
1688
1689 Prepares parameters.
1690
1691 =cut
1692
1693 sub prepare_parameters {
1694     my $c = shift;
1695     $c->prepare_body_parameters;
1696     $c->engine->prepare_parameters( $c, @_ );
1697 }
1698
1699 =head2 $c->prepare_path
1700
1701 Prepares path and base.
1702
1703 =cut
1704
1705 sub prepare_path { my $c = shift; $c->engine->prepare_path( $c, @_ ) }
1706
1707 =head2 $c->prepare_query_parameters
1708
1709 Prepares query parameters.
1710
1711 =cut
1712
1713 sub prepare_query_parameters {
1714     my $c = shift;
1715
1716     $c->engine->prepare_query_parameters( $c, @_ );
1717
1718     if ( $c->debug && keys %{ $c->request->query_parameters } ) {
1719         my $t = Text::SimpleTable->new( [ 35, 'Parameter' ], [ 36, 'Value' ] );
1720         for my $key ( sort keys %{ $c->req->query_parameters } ) {
1721             my $param = $c->req->query_parameters->{$key};
1722             my $value = defined($param) ? $param : '';
1723             $t->row( $key,
1724                 ref $value eq 'ARRAY' ? ( join ', ', @$value ) : $value );
1725         }
1726         $c->log->debug( "Query Parameters are:\n" . $t->draw );
1727     }
1728 }
1729
1730 =head2 $c->prepare_read
1731
1732 Prepares the input for reading.
1733
1734 =cut
1735
1736 sub prepare_read { my $c = shift; $c->engine->prepare_read( $c, @_ ) }
1737
1738 =head2 $c->prepare_request
1739
1740 Prepares the engine request.
1741
1742 =cut
1743
1744 sub prepare_request { my $c = shift; $c->engine->prepare_request( $c, @_ ) }
1745
1746 =head2 $c->prepare_uploads
1747
1748 Prepares uploads.
1749
1750 =cut
1751
1752 sub prepare_uploads {
1753     my $c = shift;
1754
1755     $c->engine->prepare_uploads( $c, @_ );
1756
1757     if ( $c->debug && keys %{ $c->request->uploads } ) {
1758         my $t = Text::SimpleTable->new(
1759             [ 12, 'Parameter' ],
1760             [ 26, 'Filename' ],
1761             [ 18, 'Type' ],
1762             [ 9,  'Size' ]
1763         );
1764         for my $key ( sort keys %{ $c->request->uploads } ) {
1765             my $upload = $c->request->uploads->{$key};
1766             for my $u ( ref $upload eq 'ARRAY' ? @{$upload} : ($upload) ) {
1767                 $t->row( $key, $u->filename, $u->type, $u->size );
1768             }
1769         }
1770         $c->log->debug( "File Uploads are:\n" . $t->draw );
1771     }
1772 }
1773
1774 =head2 $c->prepare_write
1775
1776 Prepares the output for writing.
1777
1778 =cut
1779
1780 sub prepare_write { my $c = shift; $c->engine->prepare_write( $c, @_ ) }
1781
1782 =head2 $c->request_class
1783
1784 Returns or sets the request class.
1785
1786 =head2 $c->response_class
1787
1788 Returns or sets the response class.
1789
1790 =head2 $c->read( [$maxlength] )
1791
1792 Reads a chunk of data from the request body. This method is designed to
1793 be used in a while loop, reading C<$maxlength> bytes on every call.
1794 C<$maxlength> defaults to the size of the request if not specified.
1795
1796 You have to set C<< MyApp->config->{parse_on_demand} >> to use this
1797 directly.
1798
1799 Warning: If you use read(), Catalyst will not process the body,
1800 so you will not be able to access POST parameters or file uploads via
1801 $c->request.  You must handle all body parsing yourself.
1802
1803 =cut
1804
1805 sub read { my $c = shift; return $c->engine->read( $c, @_ ) }
1806
1807 =head2 $c->run
1808
1809 Starts the engine.
1810
1811 =cut
1812
1813 sub run { my $c = shift; return $c->engine->run( $c, @_ ) }
1814
1815 =head2 $c->set_action( $action, $code, $namespace, $attrs )
1816
1817 Sets an action in a given namespace.
1818
1819 =cut
1820
1821 sub set_action { my $c = shift; $c->dispatcher->set_action( $c, @_ ) }
1822
1823 =head2 $c->setup_actions($component)
1824
1825 Sets up actions for a component.
1826
1827 =cut
1828
1829 sub setup_actions { my $c = shift; $c->dispatcher->setup_actions( $c, @_ ) }
1830
1831 =head2 $c->setup_components
1832
1833 Sets up components. Specify a C<setup_components> config option to pass
1834 additional options directly to L<Module::Pluggable>. To add additional
1835 search paths, specify a key named C<search_extra> as an array
1836 reference. Items in the array beginning with C<::> will have the
1837 application class name prepended to them.
1838
1839 =cut
1840
1841 sub setup_components {
1842     my $class = shift;
1843
1844     my @paths   = qw( ::Controller ::C ::Model ::M ::View ::V );
1845     my $config  = $class->config->{ setup_components };
1846     my $extra   = delete $config->{ search_extra } || [];
1847     
1848     push @paths, @$extra;
1849         
1850     my $locator = Module::Pluggable::Object->new(
1851         search_path => [ map { s/^(?=::)/$class/; $_; } @paths ],
1852         %$config
1853     );
1854
1855     my @comps = sort { length $a <=> length $b } $locator->plugins;
1856     my %comps = map { $_ => 1 } @comps;
1857     
1858     for my $component ( @comps ) {
1859
1860         # We pass ignore_loaded here so that overlay files for (e.g.)
1861         # Model::DBI::Schema sub-classes are loaded - if it's in @comps
1862         # we know M::P::O found a file on disk so this is safe
1863
1864         Catalyst::Utils::ensure_class_loaded( $component, { ignore_loaded => 1 } );
1865
1866         my $module  = $class->setup_component( $component );
1867         my %modules = (
1868             $component => $module,
1869             map {
1870                 $_ => $class->setup_component( $_ )
1871             } grep { 
1872               not exists $comps{$_}
1873             } Devel::InnerPackage::list_packages( $component )
1874         );
1875         
1876         for my $key ( keys %modules ) {
1877             $class->components->{ $key } = $modules{ $key };
1878         }
1879     }
1880 }
1881
1882 =head2 $c->setup_component
1883
1884 =cut
1885
1886 sub setup_component {
1887     my( $class, $component ) = @_;
1888
1889     unless ( $component->can( 'COMPONENT' ) ) {
1890         return $component;
1891     }
1892
1893     my $suffix = Catalyst::Utils::class2classsuffix( $component );
1894     my $config = $class->config->{ $suffix } || {};
1895
1896     my $instance = eval { $component->COMPONENT( $class, $config ); };
1897
1898     if ( my $error = $@ ) {
1899         chomp $error;
1900         Catalyst::Exception->throw(
1901             message => qq/Couldn't instantiate component "$component", "$error"/
1902         );
1903     }
1904
1905     Catalyst::Exception->throw(
1906         message =>
1907         qq/Couldn't instantiate component "$component", "COMPONENT() didn't return an object-like value"/
1908     ) unless eval { $instance->can( 'can' ) };
1909
1910     return $instance;
1911 }
1912
1913 =head2 $c->setup_dispatcher
1914
1915 Sets up dispatcher.
1916
1917 =cut
1918
1919 sub setup_dispatcher {
1920     my ( $class, $dispatcher ) = @_;
1921
1922     if ($dispatcher) {
1923         $dispatcher = 'Catalyst::Dispatcher::' . $dispatcher;
1924     }
1925
1926     if ( my $env = Catalyst::Utils::env_value( $class, 'DISPATCHER' ) ) {
1927         $dispatcher = 'Catalyst::Dispatcher::' . $env;
1928     }
1929
1930     unless ($dispatcher) {
1931         $dispatcher = $class->dispatcher_class;
1932     }
1933
1934     unless (Class::Inspector->loaded($dispatcher)) {
1935         require Class::Inspector->filename($dispatcher);
1936     }
1937
1938     # dispatcher instance
1939     $class->dispatcher( $dispatcher->new );
1940 }
1941
1942 =head2 $c->setup_engine
1943
1944 Sets up engine.
1945
1946 =cut
1947
1948 sub setup_engine {
1949     my ( $class, $engine ) = @_;
1950
1951     if ($engine) {
1952         $engine = 'Catalyst::Engine::' . $engine;
1953     }
1954
1955     if ( my $env = Catalyst::Utils::env_value( $class, 'ENGINE' ) ) {
1956         $engine = 'Catalyst::Engine::' . $env;
1957     }
1958
1959     if ( $ENV{MOD_PERL} ) {
1960
1961         # create the apache method
1962         {
1963             no strict 'refs';
1964             *{"$class\::apache"} = sub { shift->engine->apache };
1965         }
1966
1967         my ( $software, $version ) =
1968           $ENV{MOD_PERL} =~ /^(\S+)\/(\d+(?:[\.\_]\d+)+)/;
1969
1970         $version =~ s/_//g;
1971         $version =~ s/(\.[^.]+)\./$1/g;
1972
1973         if ( $software eq 'mod_perl' ) {
1974
1975             if ( !$engine ) {
1976
1977                 if ( $version >= 1.99922 ) {
1978                     $engine = 'Catalyst::Engine::Apache2::MP20';
1979                 }
1980
1981                 elsif ( $version >= 1.9901 ) {
1982                     $engine = 'Catalyst::Engine::Apache2::MP19';
1983                 }
1984
1985                 elsif ( $version >= 1.24 ) {
1986                     $engine = 'Catalyst::Engine::Apache::MP13';
1987                 }
1988
1989                 else {
1990                     Catalyst::Exception->throw( message =>
1991                           qq/Unsupported mod_perl version: $ENV{MOD_PERL}/ );
1992                 }
1993
1994             }
1995
1996             # install the correct mod_perl handler
1997             if ( $version >= 1.9901 ) {
1998                 *handler = sub  : method {
1999                     shift->handle_request(@_);
2000                 };
2001             }
2002             else {
2003                 *handler = sub ($$) { shift->handle_request(@_) };
2004             }
2005
2006         }
2007
2008         elsif ( $software eq 'Zeus-Perl' ) {
2009             $engine = 'Catalyst::Engine::Zeus';
2010         }
2011
2012         else {
2013             Catalyst::Exception->throw(
2014                 message => qq/Unsupported mod_perl: $ENV{MOD_PERL}/ );
2015         }
2016     }
2017
2018     unless ($engine) {
2019         $engine = $class->engine_class;
2020     }
2021
2022     unless (Class::Inspector->loaded($engine)) {
2023         require Class::Inspector->filename($engine);
2024     }
2025
2026     # check for old engines that are no longer compatible
2027     my $old_engine;
2028     if ( $engine->isa('Catalyst::Engine::Apache')
2029         && !Catalyst::Engine::Apache->VERSION )
2030     {
2031         $old_engine = 1;
2032     }
2033
2034     elsif ( $engine->isa('Catalyst::Engine::Server::Base')
2035         && Catalyst::Engine::Server->VERSION le '0.02' )
2036     {
2037         $old_engine = 1;
2038     }
2039
2040     elsif ($engine->isa('Catalyst::Engine::HTTP::POE')
2041         && $engine->VERSION eq '0.01' )
2042     {
2043         $old_engine = 1;
2044     }
2045
2046     elsif ($engine->isa('Catalyst::Engine::Zeus')
2047         && $engine->VERSION eq '0.01' )
2048     {
2049         $old_engine = 1;
2050     }
2051
2052     if ($old_engine) {
2053         Catalyst::Exception->throw( message =>
2054               qq/Engine "$engine" is not supported by this version of Catalyst/
2055         );
2056     }
2057
2058     # engine instance
2059     $class->engine( $engine->new );
2060 }
2061
2062 =head2 $c->setup_home
2063
2064 Sets up the home directory.
2065
2066 =cut
2067
2068 sub setup_home {
2069     my ( $class, $home ) = @_;
2070
2071     if ( my $env = Catalyst::Utils::env_value( $class, 'HOME' ) ) {
2072         $home = $env;
2073     }
2074
2075     unless ($home) {
2076         $home = Catalyst::Utils::home($class);
2077     }
2078
2079     if ($home) {
2080         $class->config->{home} ||= $home;
2081         $class->config->{root} ||= Path::Class::Dir->new($home)->subdir('root');
2082     }
2083 }
2084
2085 =head2 $c->setup_log
2086
2087 Sets up log.
2088
2089 =cut
2090
2091 sub setup_log {
2092     my ( $class, $debug ) = @_;
2093
2094     unless ( $class->log ) {
2095         $class->log( Catalyst::Log->new );
2096     }
2097
2098     my $env_debug = Catalyst::Utils::env_value( $class, 'DEBUG' );
2099     if ( defined($env_debug) ? $env_debug : $debug ) {
2100         no strict 'refs';
2101         *{"$class\::debug"} = sub { 1 };
2102         $class->log->debug('Debug messages enabled');
2103     }
2104 }
2105
2106 =head2 $c->setup_plugins
2107
2108 Sets up plugins.
2109
2110 =cut
2111
2112 =head2 $c->setup_stats
2113
2114 Sets up timing statistics class.
2115
2116 =cut
2117
2118 sub setup_stats {
2119     my ( $class, $stats ) = @_;
2120
2121     Catalyst::Utils::ensure_class_loaded($class->stats_class);
2122
2123     my $env = Catalyst::Utils::env_value( $class, 'STATS' );
2124     if ( defined($env) ? $env : ($stats || $class->debug ) ) {
2125         no strict 'refs';
2126         *{"$class\::use_stats"} = sub { 1 };
2127         $class->log->debug('Statistics enabled');
2128     }
2129 }
2130
2131
2132 =head2 $c->registered_plugins 
2133
2134 Returns a sorted list of the plugins which have either been stated in the
2135 import list or which have been added via C<< MyApp->plugin(@args); >>.
2136
2137 If passed a given plugin name, it will report a boolean value indicating
2138 whether or not that plugin is loaded.  A fully qualified name is required if
2139 the plugin name does not begin with C<Catalyst::Plugin::>.
2140
2141  if ($c->registered_plugins('Some::Plugin')) {
2142      ...
2143  }
2144
2145 =cut
2146
2147 {
2148
2149     sub registered_plugins {
2150         my $proto = shift;
2151         return sort keys %{ $proto->_plugins } unless @_;
2152         my $plugin = shift;
2153         return 1 if exists $proto->_plugins->{$plugin};
2154         return exists $proto->_plugins->{"Catalyst::Plugin::$plugin"};
2155     }
2156
2157     sub _register_plugin {
2158         my ( $proto, $plugin, $instant ) = @_;
2159         my $class = ref $proto || $proto;
2160
2161         # no ignore_loaded here, the plugin may already have been
2162         # defined in memory and we don't want to error on "no file" if so
2163
2164         Catalyst::Utils::ensure_class_loaded( $plugin );
2165
2166         $proto->_plugins->{$plugin} = 1;
2167         unless ($instant) {
2168             no strict 'refs';
2169             unshift @{"$class\::ISA"}, $plugin;
2170         }
2171         return $class;
2172     }
2173
2174     sub setup_plugins {
2175         my ( $class, $plugins ) = @_;
2176
2177         $class->_plugins( {} ) unless $class->_plugins;
2178         $plugins ||= [];
2179         for my $plugin ( reverse @$plugins ) {
2180
2181             unless ( $plugin =~ s/\A\+// ) {
2182                 $plugin = "Catalyst::Plugin::$plugin";
2183             }
2184
2185             $class->_register_plugin($plugin);
2186         }
2187     }
2188 }
2189
2190 =head2 $c->stack
2191
2192 Returns an arrayref of the internal execution stack (actions that are
2193 currently executing).
2194
2195 =head2 $c->stats_class
2196
2197 Returns or sets the stats (timing statistics) class.
2198
2199 =head2 $c->use_stats
2200
2201 Returns 1 when stats collection is enabled.  Stats collection is enabled
2202 when the -Stats options is set, debug is on or when the <MYAPP>_STATS
2203 environment variable is set.
2204
2205 Note that this is a static method, not an accessor and should be overloaded
2206 by declaring "sub use_stats { 1 }" in your MyApp.pm, not by calling $c->use_stats(1).
2207
2208 =cut
2209
2210 sub use_stats { 0 }
2211
2212
2213 =head2 $c->write( $data )
2214
2215 Writes $data to the output stream. When using this method directly, you
2216 will need to manually set the C<Content-Length> header to the length of
2217 your output data, if known.
2218
2219 =cut
2220
2221 sub write {
2222     my $c = shift;
2223
2224     # Finalize headers if someone manually writes output
2225     $c->finalize_headers;
2226
2227     return $c->engine->write( $c, @_ );
2228 }
2229
2230 =head2 version
2231
2232 Returns the Catalyst version number. Mostly useful for "powered by"
2233 messages in template systems.
2234
2235 =cut
2236
2237 sub version { return $Catalyst::VERSION }
2238
2239 =head1 INTERNAL ACTIONS
2240
2241 Catalyst uses internal actions like C<_DISPATCH>, C<_BEGIN>, C<_AUTO>,
2242 C<_ACTION>, and C<_END>. These are by default not shown in the private
2243 action table, but you can make them visible with a config parameter.
2244
2245     MyApp->config->{show_internal_actions} = 1;
2246
2247 =head1 CASE SENSITIVITY
2248
2249 By default Catalyst is not case sensitive, so C<MyApp::C::FOO::Bar> is
2250 mapped to C</foo/bar>. You can activate case sensitivity with a config
2251 parameter.
2252
2253     MyApp->config->{case_sensitive} = 1;
2254
2255 This causes C<MyApp::C::Foo::Bar> to map to C</Foo/Bar>.
2256
2257 =head1 ON-DEMAND PARSER
2258
2259 The request body is usually parsed at the beginning of a request,
2260 but if you want to handle input yourself, you can enable on-demand
2261 parsing with a config parameter.
2262
2263     MyApp->config->{parse_on_demand} = 1;
2264     
2265 =head1 PROXY SUPPORT
2266
2267 Many production servers operate using the common double-server approach,
2268 with a lightweight frontend web server passing requests to a larger
2269 backend server. An application running on the backend server must deal
2270 with two problems: the remote user always appears to be C<127.0.0.1> and
2271 the server's hostname will appear to be C<localhost> regardless of the
2272 virtual host that the user connected through.
2273
2274 Catalyst will automatically detect this situation when you are running
2275 the frontend and backend servers on the same machine. The following
2276 changes are made to the request.
2277
2278     $c->req->address is set to the user's real IP address, as read from 
2279     the HTTP X-Forwarded-For header.
2280     
2281     The host value for $c->req->base and $c->req->uri is set to the real
2282     host, as read from the HTTP X-Forwarded-Host header.
2283
2284 Obviously, your web server must support these headers for this to work.
2285
2286 In a more complex server farm environment where you may have your
2287 frontend proxy server(s) on different machines, you will need to set a
2288 configuration option to tell Catalyst to read the proxied data from the
2289 headers.
2290
2291     MyApp->config->{using_frontend_proxy} = 1;
2292     
2293 If you do not wish to use the proxy support at all, you may set:
2294
2295     MyApp->config->{ignore_frontend_proxy} = 1;
2296
2297 =head1 THREAD SAFETY
2298
2299 Catalyst has been tested under Apache 2's threading C<mpm_worker>,
2300 C<mpm_winnt>, and the standalone forking HTTP server on Windows. We
2301 believe the Catalyst core to be thread-safe.
2302
2303 If you plan to operate in a threaded environment, remember that all other
2304 modules you are using must also be thread-safe. Some modules, most notably
2305 L<DBD::SQLite>, are not thread-safe.
2306
2307 =head1 SUPPORT
2308
2309 IRC:
2310
2311     Join #catalyst on irc.perl.org.
2312
2313 Mailing Lists:
2314
2315     http://lists.rawmode.org/mailman/listinfo/catalyst
2316     http://lists.rawmode.org/mailman/listinfo/catalyst-dev
2317
2318 Web:
2319
2320     http://catalyst.perl.org
2321
2322 Wiki:
2323
2324     http://dev.catalyst.perl.org
2325
2326 =head1 SEE ALSO
2327
2328 =head2 L<Task::Catalyst> - All you need to start with Catalyst
2329
2330 =head2 L<Catalyst::Manual> - The Catalyst Manual
2331
2332 =head2 L<Catalyst::Component>, L<Catalyst::Base> - Base classes for components
2333
2334 =head2 L<Catalyst::Engine> - Core engine
2335
2336 =head2 L<Catalyst::Log> - Log class.
2337
2338 =head2 L<Catalyst::Request> - Request object
2339
2340 =head2 L<Catalyst::Response> - Response object
2341
2342 =head2 L<Catalyst::Test> - The test suite.
2343
2344 =head1 CREDITS
2345
2346 Andy Grundman
2347
2348 Andy Wardley
2349
2350 Andreas Marienborg
2351
2352 Andrew Bramble
2353
2354 Andrew Ford
2355
2356 Andrew Ruthven
2357
2358 Arthur Bergman
2359
2360 Autrijus Tang
2361
2362 Brian Cassidy
2363
2364 Carl Franks
2365
2366 Christian Hansen
2367
2368 Christopher Hicks
2369
2370 Dan Sully
2371
2372 Danijel Milicevic
2373
2374 David Kamholz
2375
2376 David Naughton
2377
2378 Drew Taylor
2379
2380 Gary Ashton Jones
2381
2382 Geoff Richards
2383
2384 Jesse Sheidlower
2385
2386 Jesse Vincent
2387
2388 Jody Belka
2389
2390 Johan Lindstrom
2391
2392 Juan Camacho
2393
2394 Leon Brocard
2395
2396 Marcus Ramberg
2397
2398 Matt S Trout
2399
2400 Robert Sedlacek
2401
2402 Sam Vilain
2403
2404 Sascha Kiefer
2405
2406 Sebastian Willert
2407
2408 Tatsuhiko Miyagawa
2409
2410 Ulf Edvinsson
2411
2412 Yuval Kogman
2413
2414 =head1 AUTHOR
2415
2416 Sebastian Riedel, C<sri@oook.de>
2417
2418 =head1 LICENSE
2419
2420 This library is free software, you can redistribute it and/or modify it under
2421 the same terms as Perl itself.
2422
2423 =cut
2424
2425 1;