whitespace cleanup
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Controller.pm
index 3db8f36..34ad350 100644 (file)
@@ -5,8 +5,7 @@ use Class::MOP;
 use Class::Load ':all';
 use String::RewritePrefix;
 use Moose::Util qw/find_meta/;
-use List::Util qw/first/;
-use List::MoreUtils qw/uniq/;
+use List::Util qw/first uniq/;
 use namespace::clean -except => 'meta';
 
 BEGIN {
@@ -143,17 +142,27 @@ sub _BEGIN : Private {
     my $begin = ( $c->get_actions( 'begin', $c->namespace ) )[-1];
     return 1 unless $begin;
     $begin->dispatch( $c );
-    return !@{ $c->error };
+    #If there is an error, all bets off
+    if( @{ $c->error }) {
+      return !@{ $c->error };
+    } else {
+      return $c->state || 1;
+    }
 }
 
 sub _AUTO : Private {
     my ( $self, $c ) = @_;
     my @auto = $c->get_actions( 'auto', $c->namespace );
     foreach my $auto (@auto) {
+        # We FORCE the auto action user to explicitly return
+        # true.  We need to do this since there's some auto
+        # users (Catalyst::Authentication::Credential::HTTP) that
+        # actually do a detach instead.
+        $c->state(0);
         $auto->dispatch( $c );
         return 0 unless $c->state;
     }
-    return 1;
+    return $c->state || 1;
 }
 
 sub _ACTION : Private {
@@ -164,7 +173,12 @@ sub _ACTION : Private {
     {
         $c->action->dispatch( $c );
     }
-    return !@{ $c->error };
+    #If there is an error, all bets off
+    if( @{ $c->error }) {
+      return !@{ $c->error };
+    } else {
+      return $c->state || 1;
+    }
 }
 
 sub _END : Private {
@@ -389,7 +403,7 @@ sub _parse_attrs {
 
         # Parse out :Foo(bar) into Foo => bar etc (and arrayify)
 
-        if ( my ( $key, $value ) = ( $attr =~ /^(.*?)(?:\(\s*(.+?)\s*\))?$/ ) )
+        if ( my ( $key, $value ) = ( $attr =~ /^(.*?)(?:\(\s*(.+?)?\s*\))?$/ ) )
         {
 
             if ( defined $value ) {
@@ -647,10 +661,25 @@ arguments, when it is instantiated:
 From L<Catalyst::Component::ApplicationAttribute>, stashes the application
 instance as $self->_application.
 
-=head2 $self->action_for('name')
+=head2 $self->action_for($action_name)
 
-Returns the Catalyst::Action object (if any) for a given method name
-in this component.
+Returns the Catalyst::Action object (if any) for a given action in this
+controller or relative to it.  You may refer to actions in controllers
+nested under the current controllers namespace, or in controllers 'up'
+from the current controller namespace.  For example:
+
+    package MyApp::Controller::One::Two;
+    use base 'Catalyst::Controller';
+
+    sub foo :Local {
+      my ($self, $c) = @_;
+      $self->action_for('foo'); # action 'foo' in Controller 'One::Two'
+      $self->action_for('three/bar'); # action 'bar' in Controller 'One::Two::Three'
+      $self->action_for('../boo'); # action 'boo' in Controller 'One'
+    }
+
+This returns 'undef' if there is no action matching the requested action
+name (after any path normalization) so you should check for this as needed.
 
 =head2 $self->action_namespace($c)
 
@@ -765,7 +794,7 @@ This is a general toolbox for attaching your action to a given path.
 =head2 Regexp
 
 B<Status: Deprecated.>  Use Chained methods or other techniques.
-If you really depend on this, install the standalone 
+If you really depend on this, install the standalone
 L<Catalyst::DispatchType::Regex> distribution.
 
 A global way to match a give regular expression in the incoming request path.
@@ -775,12 +804,12 @@ A global way to match a give regular expression in the incoming request path.
 =head2 LocalRegexp
 
 B<Status: Deprecated.>  Use Chained methods or other techniques.
-If you really depend on this, install the standalone 
+If you really depend on this, install the standalone
 L<Catalyst::DispatchType::Regex> distribution.
 
 Like L</Regex> but scoped under the namespace of the containing controller
 
-=head2 Chained 
+=head2 Chained
 
 =head2 ChainedParent
 
@@ -832,9 +861,9 @@ The following is exactly the same:
 
     package MyApp::Controller::Zoo;
 
-    sub foo  : Local Does('Moo')  { ... } # Catalyst::ActionRole::
-    sub bar  : Local Does('~Moo') { ... } # MyApp::ActionRole::Moo
-    sub baz  : Local Does('+MyApp::ActionRole::Moo') { ... }
+    sub foo  : Local Does('Buzz')  { ... } # Catalyst::ActionRole::
+    sub bar  : Local Does('~Buzz') { ... } # MyApp::ActionRole::Buzz
+    sub baz  : Local Does('+MyApp::ActionRole::Buzz') { ... }
 
 =head2 GET
 
@@ -900,15 +929,19 @@ declared attributes you must quote them:
 
 If you use 'reference' type constraints (such as ArrayRef[Int]) that have an unknown
 number of allowed matches, we set this the same way "Args" is.  Please keep in mind
-that actions with an undetermined number of args match at lower precidence than those
+that actions with an undetermined number of args match at lower precedence than those
 with a fixed number.  You may use reference types such as Tuple from L<Types::Standard>
 that allows you to fix the number of allowed args.  For example Args(Tuple[Int,Int])
 would be determined to be two args (or really the same as Args(Int,Int).)  You may
-find this useful for creating custom subtypes with complex matching rules that you 
+find this useful for creating custom subtypes with complex matching rules that you
 wish to reuse over many actions.
 
 See L<Catalyst::RouteMatching> for more.
 
+B<Note>: It is highly recommended to use L<Type::Tiny> for your type constraints over
+other options.  L<Type::Tiny> exposed a better meta data interface which allows us to
+do more and better types of introspection driving tests and debugging.
+
 =head2 Consumes('...')
 
 Matches the current action against the content-type of the request.  Typically
@@ -1014,7 +1047,7 @@ Allows you to customize parsing of subroutine attributes.
 
 Please note that this feature does not let you actually assign new functions
 to actions via subroutine attributes, but is really more for creating useful
-aliases to existing core and extended attributes, and transforms based on 
+aliases to existing core and extended attributes, and transforms based on
 existing information (like from configuration).  Code for actually doing
 something meaningful with the subroutine attributes will be located in the
 L<Catalyst::Action> classes (or your subclasses), L<Catalyst::Dispatcher> and