Initial support for :Args attribute
[catagits/Catalyst-Runtime.git] / lib / Catalyst / DispatchType / Regex.pm
index b906f69..49f7636 100644 (file)
@@ -2,7 +2,7 @@ package Catalyst::DispatchType::Regex;
 
 use strict;
 use base qw/Catalyst::DispatchType::Path/;
-use Text::ASCIITable;
+use Text::SimpleTable;
 
 =head1 NAME
 
@@ -16,28 +16,22 @@ See L<Catalyst>.
 
 =head1 METHODS
 
-=over 4
-
-=item $self->list($c)
+=head2 $self->list($c)
 
 =cut
 
 sub list {
     my ( $self, $c ) = @_;
-    my $re = Text::ASCIITable->new;
-    $re->setCols( 'Regex', 'Private' );
-    $re->setColWidth( 'Regex',   36, 1 );
-    $re->setColWidth( 'Private', 37, 1 );
+    my $re = Text::SimpleTable->new( [ 36, 'Regex' ], [ 37, 'Private' ] );
     for my $regex ( @{ $self->{compiled} } ) {
-        my $compiled = $regex->{re};
-        my $action   = $regex->{action};
-        $re->addRow( $compiled, "/$action" );
+        my $action = $regex->{action};
+        $re->row( $regex->{path}, "/$action" );
     }
     $c->log->debug( "Loaded Regex actions:\n" . $re->draw )
-      if ( @{ $re->{tbl_rows} } );
+      if ( @{ $self->{compiled} } );
 }
 
-=item $self->match( $c, $path )
+=head2 $self->match( $c, $path )
 
 =cut
 
@@ -50,6 +44,7 @@ sub match {
 
     foreach my $compiled ( @{ $self->{compiled} || [] } ) {
         if ( my @snippets = ( $path =~ $compiled->{re} ) ) {
+            next unless $compiled->{action}->match($c);
             $c->req->action( $compiled->{path} );
             $c->req->match($path);
             $c->req->snippets( \@snippets );
@@ -62,7 +57,7 @@ sub match {
     return 0;
 }
 
-=item $self->register( $c, $action )
+=head2 $self->register( $c, $action )
 
 =cut
 
@@ -70,23 +65,36 @@ sub register {
     my ( $self, $c, $action ) = @_;
     my $attrs = $action->attributes;
     my @register = map { @{ $_ || [] } } @{$attrs}{ 'Regex', 'Regexp' };
+    foreach
+      my $r ( map { @{ $_ || [] } } @{$attrs}{ 'LocalRegex', 'LocalRegexp' } )
+    {
+        unless ( $r =~ s/^\^// ) { $r = "(?:.*?)$r"; }
+        push( @register, '^' . $action->namespace . '/' . $r );
+    }
+
     foreach my $r (@register) {
-        unless ($r =~ /^\^/) {     # Relative regex
-            $r = '^'.$action->namespace.'/'.$r;
-        }
-        $self->{paths}{$r} = $action;    # Register path for superclass
-        push(
-            @{ $self->{compiled} },      # and compiled regex for us
-            {
-                re     => qr#$r#,
-                action => $action,
-                path   => $r,
-            }
-        );
+        $self->register_path( $c, $r, $action );
+        $self->register_regex( $c, $r, $action );
     }
+    return 1 if @register;
+    return 0;
 }
 
-=back
+=head2 $self->register_regex($c, $re, $action)
+
+=cut
+
+sub register_regex {
+    my ( $self, $c, $re, $action ) = @_;
+    push(
+        @{ $self->{compiled} },    # and compiled regex for us
+        {
+            re     => qr#$re#,
+            action => $action,
+            path   => $re,
+        }
+    );
+}
 
 =head1 AUTHOR