X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst.pm;h=ae606613ea3279d0273f8942e7f6d75efe1191d2;hb=448e5011e539a42791c6822a3473fb627ce6af41;hp=e5b1882fd6ebbf8c6f520b332eedd9b959820afa;hpb=1be0c4f8966328b3d90c5ebf82f924d97a15dfd9;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index e5b1882..ae60661 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -349,6 +349,21 @@ Or make sure to always return true values from your actions and write your code like this: $c->forward('foo') || return; + +Another note is that C<< $c->forward >> always returns a scalar because it +actually returns $c->state which operates in a scalar context. +Thus, something like: + + return @array; + +in an action that is forwarded to is going to return a scalar, +i.e. how many items are in that array, which is probably not what you want. +If you need to return an array then return a reference to it, +or stash it like so: + + $c->stash->{array} = \@array; + +and access it from the stash. =cut @@ -490,7 +505,9 @@ sub error { =head2 $c->state -Contains the return value of the last executed action. +Contains the return value of the last executed action. +Note that << $c->state >> operates in a scalar context which means that all +values it returns are scalar. =head2 $c->clear_errors @@ -535,6 +552,10 @@ sub _comp_names_search_prefixes { # if we were given a regexp to search against, we're done. return if ref $name; + # skip regexp fallback if configured + return + if $appclass->config->{disable_component_resolution_regex_fallback}; + # regexp fallback $query = qr/$name/i; @result = grep { $eligible{ $_ } =~ m{$query} } keys %eligible; @@ -552,7 +573,8 @@ sub _comp_names_search_prefixes { (join '", "', @result) . "'. Relying on regexp fallback behavior for " . "component resolution is unreliable and unsafe."; my $short = $result[0]; - $short =~ s/.*?Model:://; + # remove the component namespace prefix + $short =~ s/.*?(Model|Controller|View):://; my $shortmess = Carp::shortmess(''); if ($shortmess =~ m#Catalyst/Plugin#) { $msg .= " You probably need to set '$short' instead of '${name}' in this " . @@ -561,7 +583,7 @@ sub _comp_names_search_prefixes { $msg .= " You probably need to set '$short' instead of '${name}' in this " . "component's config"; } else { - $msg .= " You probably meant \$c->${warn_for}('$short') instead of \$c->${warn_for}({'${name}'}), " . + $msg .= " You probably meant \$c->${warn_for}('$short') instead of \$c->${warn_for}('${name}'), " . "but if you really wanted to search, pass in a regexp as the argument " . "like so: \$c->${warn_for}(qr/${name}/)"; } @@ -778,6 +800,12 @@ should be used instead. If C<$name> is a regexp, a list of components matched against the full component name will be returned. +If Catalyst can't find a component by name, it will fallback to regex +matching by default. To disable this behaviour set +disable_component_resolution_regex_fallback to a true value. + + __PACKAGE__->config( { disable_component_resolution_regex_fallback => 1 } ); + =cut sub component { @@ -1606,7 +1634,7 @@ sub _stats_start_execute { if ( my $parent = $c->stack->[-1] ) { $c->stats->profile( begin => $action, - parent => "$parent" . $c->counter->{"$parent"}, + parent => "$parent" . ($c->counter->{"$parent"} || 0), uid => $uid, ); } @@ -2635,6 +2663,10 @@ messages in template systems. sub version { return $Catalyst::VERSION } +=head1 CONFIGURATION + + # TODO include things like 'current_view' and maybe reiterate things like 'name' too + =head1 INTERNAL ACTIONS Catalyst uses internal actions like C<_DISPATCH>, C<_BEGIN>, C<_AUTO>, @@ -2762,6 +2794,8 @@ abw: Andy Wardley acme: Leon Brocard +abraxxa: Alexander Hartmaier + Andrew Bramble Andrew Ford EA.Ford@ford-mason.co.ukE