X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst.pm;h=8cccb9a47ec144cf82bfb1d6db41cd8b72851f68;hb=9b0ec7a17caeecd0df1b4a855469777befa2e9d5;hp=768e0134b25c67083d1f45b5264df8e071feac52;hpb=f8ad6ea56eeb4d3a3d5d77cf502651712dfb5e62;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index 768e013..8cccb9a 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -3,7 +3,6 @@ package Catalyst; use strict; use base 'Catalyst::Component'; use bytes; -use UNIVERSAL::require; use Catalyst::Exception; use Catalyst::Log; use Catalyst::Request; @@ -25,6 +24,8 @@ use attributes; use utf8; use Carp qw/croak/; +BEGIN { require 5.008001; } + __PACKAGE__->mk_accessors( qw/counter request response state action stack namespace stats/ ); @@ -49,9 +50,6 @@ our $DETACH = "catalyst_detach\n"; require Module::Pluggable::Fast; -# Helper script generation -our $CATALYST_SCRIPT_GEN = 27; - __PACKAGE__->mk_classdata($_) for qw/components arguments dispatcher engine log dispatcher_class engine_class context_class request_class response_class setup_finished/; @@ -104,7 +102,7 @@ Catalyst - The Elegant MVC Web Application Framework ### in lib/MyApp.pm use Catalyst qw/-Debug/; # include plugins here as well - ### In libMyApp/Controller/Root.pm (autocreated) + ### In lib/MyApp/Controller/Root.pm (autocreated) sub foo : Global { # called for /foo, /foo/1, /foo/1/2, etc. my ( $self, $c, @args ) = @_; # args are qw/1 2/ for /foo/1/2 $c->stash->{template} = 'foo.tt'; # set the template @@ -322,8 +320,8 @@ sub stash { if (@_) { my $stash = @_ > 1 ? {@_} : $_[0]; croak('stash takes a hash or hashref') unless ref $stash; - while ( my ( $key, $val ) = each %$stash ) { - $c->{stash}->{$key} = $val; + foreach my $key ( keys %$stash ) { + $c->{stash}->{$key} = $stash->{$key}; } } return $c->{stash}; @@ -593,8 +591,6 @@ sub component { $comp = $c->_comp_search($name); return $c->_filter_component( $comp, @_ ) if defined($comp); - - croak("Unable to find component $name"); } return sort keys %{ $c->components }; @@ -650,6 +646,9 @@ L man page. Overload to enable debug messages (same as -Debug option). +Note that this is a static method, not an accessor and should be overloaded +by declaring "sub debug { 1 }" in your MyApp.pm, not by calling $c->debug(1). + =cut sub debug { 0 } @@ -777,8 +776,9 @@ sub setup { } } - $class->log->warn( - <<"EOF") if ( $ENV{CATALYST_SCRIPT_GEN} && ( $ENV{CATALYST_SCRIPT_GEN} < $Catalyst::CATALYST_SCRIPT_GEN ) ); + eval { require Catalyst::Devel; }; + if( !$@ && $ENV{CATALYST_SCRIPT_GEN} && ( $ENV{CATALYST_SCRIPT_GEN} < $Catalyst::Devel::CATALYST_SCRIPT_GEN ) ) { + $class->log->warn(<<"EOF"); You are running an old script! Please update by running (this will overwrite existing files): @@ -787,7 +787,8 @@ You are running an old script! or (this will not overwrite existing files): catalyst.pl -scripts $class EOF - + } + if ( $class->debug ) { my @plugins = (); @@ -864,6 +865,11 @@ end of the path. If the last argument to uri_for is a hash reference, it is assumed to contain GET parameter key/value pairs, which will be appended to the URI in standard fashion. +Instead of $path, you can also optionally pass a $action object which will +be resolved to a path using $c->dispatcher->uri_for_action; if the first +element of @args is an arrayref it is treated as a list of captures to be +passed to uri_for_action. + =cut sub uri_for { @@ -874,6 +880,14 @@ sub uri_for { $basepath .= '/'; my $namespace = $c->namespace || ''; + if ( Scalar::Util::blessed($path) ) { # action object + my $captures = ( scalar @args && ref $args[0] eq 'ARRAY' + ? shift(@args) + : [] ); + $path = $c->dispatcher->uri_for_action($path, $captures); + return undef unless defined($path); + } + # massage namespace, empty if absolute path $namespace =~ s/^\/// if $namespace; $namespace .= '/' if $namespace; @@ -1873,11 +1887,8 @@ sub setup_dispatcher { $dispatcher = $class->dispatcher_class; } - $dispatcher->require; - - if ($@) { - Catalyst::Exception->throw( - message => qq/Couldn't load dispatcher "$dispatcher", "$@"/ ); + unless (Class::Inspector->loaded($dispatcher)) { + require Class::Inspector->filename($dispatcher); } # dispatcher instance @@ -1968,12 +1979,8 @@ sub setup_engine { $engine = $class->engine_class; } - $engine->require; - - if ($@) { - Catalyst::Exception->throw( message => -qq/Couldn't load engine "$engine" (maybe you forgot to install it?), "$@"/ - ); + unless (Class::Inspector->loaded($engine)) { + require Class::Inspector->filename($engine); } # check for old engines that are no longer compatible @@ -2101,12 +2108,8 @@ the plugin name does not begin with C. my ( $proto, $plugin, $instant ) = @_; my $class = ref $proto || $proto; - $plugin->require; - - if ( my $error = $@ ) { - my $type = $instant ? "instant " : ''; - Catalyst::Exception->throw( - message => qq/Couldn't load ${type}plugin "$plugin", $error/ ); + unless (Class::Inspector->loaded($plugin)) { + require Class::Inspector->filename($plugin); } $proto->_plugins->{$plugin} = 1;