mro compat stuff
[catagits/Catalyst-Runtime.git] / lib / Catalyst / DispatchType / Path.pm
index ac28382..98e3b97 100644 (file)
@@ -1,10 +1,22 @@
 package Catalyst::DispatchType::Path;
 
-use strict;
-use base qw/Catalyst::DispatchType/;
+use MRO::Compat;
+use mro 'c3';
+use Moose;
+extends 'Catalyst::DispatchType';
+
 use Text::SimpleTable;
 use URI;
 
+has _paths => (
+               is => 'rw',
+               isa => 'HashRef',
+               required => 1,
+               default => sub { +{} },
+              );
+
+no Moose;
+
 =head1 NAME
 
 Catalyst::DispatchType::Path - Path DispatchType
@@ -26,19 +38,21 @@ Debug output for Path dispatch points
 sub list {
     my ( $self, $c ) = @_;
     my $paths = Text::SimpleTable->new( [ 35, 'Path' ], [ 36, 'Private' ] );
-    foreach my $path ( sort keys %{ $self->{paths} } ) {
-        foreach my $action ( @{ $self->{paths}->{$path} } ) {
-            $path = "/$path" unless $path eq '/';
-            $paths->row( "$path", "/$action" );
+    foreach my $path ( sort keys %{ $self->_paths } ) {
+        my $display_path = $path eq '/' ? $path : "/$path";
+        foreach my $action ( @{ $self->_paths->{$path} } ) {
+            $paths->row( $display_path, "/$action" );
         }
     }
-    $c->log->debug( "Loaded Path actions:\n" . $paths->draw )
-      if ( keys %{ $self->{paths} } );
+    $c->log->debug( "Loaded Path actions:\n" . $paths->draw . "\n" )
+      if ( keys %{ $self->_paths } );
 }
 
 =head2 $self->match( $c, $path )
 
-Check for paths that match the given path.
+For each action registered to this exact path, offers the action a chance to
+match the path (in the order in which they were registered). Succeeds on the
+first action that matches, if any; if not, returns 0.
 
 =cut
 
@@ -47,7 +61,7 @@ sub match {
 
     $path ||= '/';
 
-    foreach my $action ( @{ $self->{paths}->{$path} || [] } ) {
+    foreach my $action ( @{ $self->_paths->{$path} || [] } ) {
         next unless $action->match($c);
         $c->req->action($path);
         $c->req->match($path);
@@ -61,7 +75,7 @@ sub match {
 
 =head2 $self->register( $c, $action )
 
-Call register_path for every path attribute in the given $action.
+Calls register_path for every Path attribute for the given $action.
 
 =cut
 
@@ -78,7 +92,7 @@ sub register {
 
 =head2 $self->register_path($c, $path, $action)
 
-register an action at a given path.
+Registers an action at a given path.
 
 =cut
 
@@ -88,11 +102,34 @@ sub register_path {
     $path = '/' unless length $path;
     $path = URI->new($path)->canonical;
 
-    unshift( @{ $self->{paths}{$path} ||= [] }, $action);
+    unshift( @{ $self->_paths->{$path} ||= [] }, $action);
 
     return 1;
 }
 
+=head2 $self->uri_for_action($action, $captures)
+
+get a URI part for an action; always returns undef is $captures is set
+since Path actions don't have captures
+
+=cut
+
+sub uri_for_action {
+    my ( $self, $action, $captures ) = @_;
+
+    return undef if @$captures;
+
+    if (my $paths = $action->attributes->{Path}) {
+        my $path = $paths->[0];
+        $path = '/' unless length($path);
+        $path = "/${path}" unless ($path =~ m/^\//);
+        $path = URI->new($path)->canonical;
+        return $path;
+    } else {
+        return undef;
+    }
+}
+
 =head1 AUTHOR
 
 Matt S Trout
@@ -105,4 +142,6 @@ the same terms as Perl itself.
 
 =cut
 
+__PACKAGE__->meta->make_immutable;
+
 1;