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