Initial support for :Args attribute
[catagits/Catalyst-Runtime.git] / lib / Catalyst / DispatchType / Regex.pm
index c373d2f..49f7636 100644 (file)
@@ -2,6 +2,7 @@ package Catalyst::DispatchType::Regex;
 
 use strict;
 use base qw/Catalyst::DispatchType::Path/;
+use Text::SimpleTable;
 
 =head1 NAME
 
@@ -15,9 +16,22 @@ See L<Catalyst>.
 
 =head1 METHODS
 
-=over 4
+=head2 $self->list($c)
 
-=item $self->match( $c, $path )
+=cut
+
+sub list {
+    my ( $self, $c ) = @_;
+    my $re = Text::SimpleTable->new( [ 36, 'Regex' ], [ 37, 'Private' ] );
+    for my $regex ( @{ $self->{compiled} } ) {
+        my $action = $regex->{action};
+        $re->row( $regex->{path}, "/$action" );
+    }
+    $c->log->debug( "Loaded Regex actions:\n" . $re->draw )
+      if ( @{ $self->{compiled} } );
+}
+
+=head2 $self->match( $c, $path )
 
 =cut
 
@@ -30,11 +44,12 @@ 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 );
             $c->action( $compiled->{action} );
-            $c->namespace( $compiled->{action}->prefix );
+            $c->namespace( $compiled->{action}->namespace );
             return 1;
         }
     }
@@ -42,7 +57,7 @@ sub match {
     return 0;
 }
 
-=item $self->register( $c, $action )
+=head2 $self->register( $c, $action )
 
 =cut
 
@@ -50,20 +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) {
-        $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