1 package CatalystX::Routes;
6 use CatalystX::Routes::Role::Class;
7 use CatalystX::Routes::Role::Controller;
8 use Moose::Util qw( apply_all_roles );
9 use Params::Util qw( _STRING _CODELIKE );
10 use Scalar::Util qw( blessed );
14 Moose::Exporter->setup_import_methods(
15 with_meta => [qw( get get_html post put del )],
16 as_is => [qw( chained args capture_args path_part action )],
18 class => ['CatalystX::Routes::Role::Class'],
23 _add_route( 'GET', @_ );
27 _add_route( 'GET_html', @_ );
31 _add_route( 'POST', @_ );
35 _add_route( 'PUT', @_ );
39 _add_route( 'DELETE', @_ );
45 my ( $name, $attrs, $sub ) = _process_args(@_);
47 my $meth_base = '__route__' . $name;
49 _maybe_add_rest_route( $meta, $meth_base, $attrs );
51 my $meth_name = $meth_base . q{_} . $rest;
53 $meta->add_method( $meth_name => sub { goto &$sub } );
59 return ( PathPart => [ $_[0] ] );
63 return ( Chained => [ $_[0] ] );
67 return ( Args => [ $_[0] ] );
70 sub capture_args ($) {
71 return ( CaptureArgs => [ $_[0] ] );
75 return ( ActionClass => [ $_[0] ] );
82 my $caller = ( caller(2) )[3];
85 "The $caller keyword expects a path string or regex as its first argument"
86 unless _STRINGLIKE0($path) || _REGEX($path);
88 die "The $caller keyword expects a sub ref as its final argument"
89 unless _CODELIKE($sub);
93 $p{ActionClass} ||= 'REST';
95 ( my $name = $path ) =~ s/(\W)/'X' . sprintf( '%x', ord($1) )/eg;
97 return $name, \%p, $sub;
100 sub _maybe_add_rest_route {
105 return if $meta->has_method($name);
107 # This could be done by Moose::Exporter, but that would require that the
108 # module has already inherited from Cat::Controller when it calls "use
109 # CatalystX::Routes".
110 unless ( $meta->does_role('CatalystX::Routes::Role::Controller') ) {
113 'CatalystX::Routes::Role::Controller'
117 $meta->add_method( $name => sub { } );
119 $meta->add_route( $name => [ $attrs, $meta->get_method($name) ] );
124 # XXX - this should be added to Params::Util
125 sub _STRINGLIKE0 ($) {
126 return _STRING( $_[0] )
130 && overload::Method( $_[0], q{""} )