new match and match captutres for http methods, plus tests, docs
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Action.pm
index af60527..fb5c9c6 100644 (file)
@@ -65,15 +65,47 @@ sub execute {
   $self->code->(@_);
 }
 
+sub match_captures { 
+  my ( $self, $c, $captures ) = @_;
+  ## It would seem that now that we can match captures, we could remove a lot
+  ## of the capture_args to args mapping all around.  I gave it a go, but was
+  ## not trival, contact jnap on irc for what I tried if you want to try.
+  ##  return $self->_match_has_expected_capture_args($captures) &&
+    return $self->_match_has_expected_http_method($c->req->method);
+}
+
 sub match {
-    my ( $self, $c ) = @_;
-    #would it be unreasonable to store the number of arguments
-    #the action has as its own attribute?
-    #it would basically eliminate the code below.  ehhh. small fish
-    return 1 unless exists $self->attributes->{Args};
-    my $args = $self->attributes->{Args}[0];
-    return 1 unless defined($args) && length($args);
-    return scalar( @{ $c->req->args } ) == $args;
+  my ( $self, $c ) = @_;
+  return $self->_match_has_expected_args($c->req->args) &&
+    $self->_match_has_expected_http_method($c->req->method);
+}
+
+sub _match_has_expected_args {
+  my ($self, $req_args) = @_;
+  return 1 unless exists $self->attributes->{Args};
+  my $args = $self->attributes->{Args}[0];
+  return 1 unless defined($args) && length($args);
+  return scalar( @{$req_args} ) == $args;
+}
+
+sub _match_has_expected_capture_args {
+  my ($self, $req_args) = @_;
+  return 1 unless exists $self->attributes->{CaptureArgs};
+  my $args = $self->attributes->{CaptureArgs}[0];
+  return 1 unless defined($args) && length($args);
+  return scalar( @{$req_args} ) == $args;
+}
+
+sub _match_has_expected_http_method {
+  my ($self, $method) = @_;
+  my @methods = @{ $self->attributes->{Method} || [] };
+  if(scalar @methods) {
+    my $result = scalar(grep { lc($_) eq lc($method) } @methods) ? 1:0;
+    return $result;
+  } else {
+    ## No HTTP Methods to check
+    return 1;
+  }
 }
 
 sub compare {
@@ -138,6 +170,16 @@ context and arguments
 Check Args attribute, and makes sure number of args matches the setting.
 Always returns true if Args is omitted.
 
+=head2 match_captures ($c, $captures)
+
+Can be implemented by action class and action role authors. If the method
+exists, then it will be called with the request context and an array reference
+of the captures for this action.
+
+Returning true from this method causes the chain match to continue, returning
+makes the chain not match (and alternate, less preferred chains will be attempted).
+
+
 =head2 compare
 
 Compares 2 actions based on the value of the C<Args> attribute, with no C<Args>
@@ -172,17 +214,6 @@ Returns the number of captures this action expects for L<Chained|Catalyst::Dispa
 
 Provided by Moose.
 
-=head1 OPTIONAL METHODS
-
-=head2 match_captures
-
-Can be implemented by action class and action role authors. If the method
-exists, then it will be called with the request context and an array reference
-of the captures for this action.
-
-Returning true from this method causes the chain match to continue, returning
-makes the chain not match (and alternate, less preferred chains will be attempted).
-
 =head1 AUTHORS
 
 Catalyst Contributors, see Catalyst.pm