Grammar tweaklet
[catagits/CatalystX-Routes.git] / lib / CatalystX / Routes / Role / Controller.pm
1 package CatalystX::Routes::Role::Controller;
2
3 use Moose::Role;
4 use namespace::autoclean;
5
6 requires 'register_actions';
7
8 after register_actions => sub {
9     my $self = shift;
10     my $c    = shift;
11
12     for my $route ( $self->meta()->route_names() ) {
13         my ( $attrs, $method ) = @{ $self->meta()->get_route($route) };
14
15         $self->_add_cx_routes_action( $c, $route, $attrs, $method->body() );
16     }
17
18     for my $chain_point ( $self->meta()->chain_point_names() ) {
19         my ( $attrs, $code )
20             = @{ $self->meta()->get_chain_point($chain_point) };
21
22         $self->_add_cx_routes_action( $c, $chain_point, $attrs, $code );
23     }
24 };
25
26 sub _add_cx_routes_action {
27     my $self  = shift;
28     my $c     = shift;
29     my $name  = shift;
30     my $attrs = shift;
31     my $code  = shift;
32
33     my $class     = $self->catalyst_component_name;
34     my $namespace = $self->action_namespace($c);
35
36     for my $key ( keys %{$attrs} ) {
37         my $parse_meth = "_parse_${key}_attr";
38
39         next unless $self->can($parse_meth);
40
41         ( undef, my $value )
42             = $self->$parse_meth( $c, $name, $attrs->{$key} );
43
44         $attrs->{$key} = [$value];
45     }
46
47     my $reverse = $namespace ? "${namespace}/$name" : $name;
48
49     my $action = $self->create_action(
50         name       => $name,
51         code       => $code,
52         reverse    => $reverse,
53         namespace  => $namespace,
54         class      => $class,
55         attributes => $attrs,
56     );
57
58     $c->dispatcher->register( $c, $action );
59 }
60
61 1;