initial checkin
[catagits/CatalystX-Routes.git] / lib / CatalystX / Routes / Role / Controller.pm
diff --git a/lib/CatalystX/Routes/Role/Controller.pm b/lib/CatalystX/Routes/Role/Controller.pm
new file mode 100644 (file)
index 0000000..e62a212
--- /dev/null
@@ -0,0 +1,44 @@
+package CatalystX::Routes::Role::Controller;
+
+use Moose::Role;
+use namespace::clean -except => 'meta';
+
+requires 'register_actions';
+
+after register_actions => sub {
+    my $self = shift;
+    my $c    = shift;
+
+    my $class     = $self->catalyst_component_name;
+    my $namespace = $self->action_namespace($c);
+
+    for my $route ( $self->meta()->route_names() ) {
+        my ( $attrs, $method ) = @{ $self->meta()->get_route($route) };
+
+        for my $key ( keys %{$attrs} ) {
+            my $parse_meth = "_parse_${key}_attr";
+
+            next unless $self->can($parse_meth);
+
+            ( undef, my $value )
+                = $self->$parse_meth( $c, $route, $attrs->{$key} );
+
+            $attrs->{$key} = [$value];
+        }
+
+        my $reverse = $namespace ? "${namespace}/$route" : $route;
+
+        my $action = $self->create_action(
+            name       => $route,
+            code       => $method->body(),
+            reverse    => $reverse,
+            namespace  => $namespace,
+            class      => $class,
+            attributes => $attrs,
+        );
+
+        $c->dispatcher->register( $c, $action );
+    }
+};
+
+1;