preparations for new MXDs MXRP usage, signature api fix
Robert 'phaylon' Sedlacek [Tue, 18 Aug 2009 17:43:25 +0000 (19:43 +0200)]
Changes
Makefile.PL
lib/CatalystX/Declare/Keyword/Action.pm
lib/CatalystX/Declare/Keyword/Role.pm
t/022_parameterized_roles.t [new file with mode: 0644]
t/lib/TestApp/Controller/Parameterized.pm [new file with mode: 0644]
t/lib/TestApp/ControllerRole/Parameterized.pm [new file with mode: 0644]

diff --git a/Changes b/Changes
index 859ec6a..6a16c6d 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,5 +1,7 @@
 [0.008] ...
     - default_inner now ignores arguments
+    - preparations for parameterized roles
+    - MooseX::Method::Signatures now publically exposes signature object
 
 [0.007] Sun Aug 16 04:12:43 CEST 2009
     - used namespace keyword in examples
index 830be13..39b9d80 100644 (file)
@@ -27,10 +27,10 @@ requires        'CLASS',                            '1.00';
 requires        'Devel::Declare',                   '0.005011';
 requires        'Moose',                            '0.89';
 requires        'MooseX::AttributeHelpers',         '0.16';
-requires        'MooseX::Declare',                  '0.24';
+requires        'MooseX::Declare',                  '0.26';
 requires        'MooseX::MethodAttributes',         '0.15';
-requires        'MooseX::Types',                    '0.16';
-requires        'MooseX::Method::Signatures',       '0.16';
+requires        'MooseX::Types',                    '0.17';
+requires        'MooseX::Method::Signatures',       '0.20';
 requires        'TryCatch',                         '1.001001';
 requires        'FindBin';
 
index 623e1a6..0e883c3 100644 (file)
@@ -1,4 +1,5 @@
 use MooseX::Declare;
+use MooseX::Role::Parameterized ();
 
 class CatalystX::Declare::Keyword::Action
     with MooseX::Declare::Syntax::KeywordHandling {
@@ -8,7 +9,7 @@ class CatalystX::Declare::Keyword::Action
     use Perl6::Junction     qw( any );
     use Data::Dump          qw( pp );
     use MooseX::Types::Util qw( has_available_type_export );
-    use Moose::Util         qw( add_method_modifier );
+    use Moose::Util         qw( add_method_modifier ensure_all_roles );
     use Class::Inspector;
     use Class::MOP;
 
@@ -19,6 +20,7 @@ class CatalystX::Declare::Keyword::Action
     use aliased 'CatalystX::Declare::Action::CatchValidationError';
     use aliased 'MooseX::Method::Signatures::Meta::Method';
     use aliased 'MooseX::MethodAttributes::Role::Meta::Method', 'AttributeRole';
+    use aliased 'MooseX::MethodAttributes::Role::Meta::Role',   'AttributeMetaRole';
 
 
     method parse (Object $ctx, Str :$modifier?, Int :$skipped_declarator = 0) {
@@ -141,8 +143,25 @@ class CatalystX::Declare::Keyword::Action
             }
             else {
 
-                $class->meta->add_method($name, $method);
-                $class->meta->register_method_attributes($class->can($method->name), \@attributes);
+                my $prepare_meta = sub {
+                    my ($meta) = @_;
+
+                    $meta->add_method($name, $method);
+                    $meta->register_method_attributes($meta->name->can($method->name), \@attributes);
+                };
+
+                if ($ctx->stack->[-1] and $ctx->stack->[-1]->is_parameterized) {
+                    my $real_meta = MooseX::Role::Parameterized->current_metaclass;
+
+                    $real_meta->meta->make_mutable
+                        if $real_meta->meta->is_immutable;
+                    ensure_all_roles $real_meta->meta, AttributeMetaRole
+                        if $real_meta->isa('Moose::Meta::Role');
+
+                    $real_meta->$prepare_meta;
+                }
+
+                $class->meta->$prepare_meta;
             }
         });
     }
@@ -289,7 +308,7 @@ class CatalystX::Declare::Keyword::Action
     }
 
     method _count_positional_arguments (Object $method) {
-        my $signature = $method->_parsed_signature;
+        my $signature = $method->parsed_signature;
 
         if ($signature->has_positional_params) {
             my $count = @{ scalar($signature->positional_params) };
index af904ee..6220562 100644 (file)
@@ -5,23 +5,42 @@ class CatalystX::Declare::Keyword::Role
 
 
     use aliased 'MooseX::MethodAttributes::Role::Meta::Role';
-    use aliased 'CatalystX::Declare::Keyword::Action', 'ActionKeyword';
+    use aliased 'MooseX::Role::Parameterized::Meta::Role::Parameterizable';
+    use aliased 'CatalystX::Declare::Keyword::Action',  'ActionKeyword';
 
 
+    around import_symbols_from (Object $ctx) {
+
+        $ctx->has_parameter_signature
+        ? $self->$orig($ctx)
+        : sprintf('Moose::Role -traits => q(MethodAttributes),')
+    }
+
     before add_namespace_customizations (Object $ctx, Str $package) {
 
+        my $source  = $self->import_symbols_from($ctx);
+        my @symbols = $self->imported_moose_symbols;
+
         $ctx->add_preamble_code_parts(
             'use CLASS',
-            'use Moose::Role -traits => q(MethodAttributes)',
         );
     }
 
-    around default_inner {
+    after add_namespace_customizations (Object $ctx, Str $package) {
+
+        $ctx->add_preamble_code_parts(
+            sprintf(
+                'use %s -traits => q(%s), qw( has )',
+                'MooseX::Role::Parameterized',
+                'MooseX::MethodAttributes::Role::Meta::Role',
+            ),
+        ) if $ctx->has_parameter_signature;
+    }
 
-        my @modifiers = qw( );
+    around default_inner (@args) {
 
         return [ 
-            ( grep { my $id = $_->identifier; not grep { $id eq $_ } @modifiers } @{ $self->$orig() || [] } ),
+            @{ $self->$orig(@args) },
             ActionKeyword->new(identifier => 'action'),
             ActionKeyword->new(identifier => 'under'),
             ActionKeyword->new(identifier => 'final'),
diff --git a/t/022_parameterized_roles.t b/t/022_parameterized_roles.t
new file mode 100644 (file)
index 0000000..11a125b
--- /dev/null
@@ -0,0 +1,16 @@
+#!/usr/bin/env perl
+use strict;
+use warnings;
+
+use FindBin;
+use lib "$FindBin::Bin/lib";
+
+use Test::More; 
+use Catalyst::Test 'TestApp';
+
+TODO: {
+    local $TODO = 'MooseX::MethodAttributes needs to allow this';
+    is get('/param/greet'), 'foo:foo', 'parameterized role was consumed correctly';
+}
+
+done_testing;
diff --git a/t/lib/TestApp/Controller/Parameterized.pm b/t/lib/TestApp/Controller/Parameterized.pm
new file mode 100644 (file)
index 0000000..e8f7901
--- /dev/null
@@ -0,0 +1,7 @@
+use CatalystX::Declare;
+
+controller TestApp::Controller::Parameterized is mutable {
+    with 'TestApp::ControllerRole::Parameterized' => { message => 'foo' };
+
+    action base under '/' as 'param';
+}
diff --git a/t/lib/TestApp/ControllerRole/Parameterized.pm b/t/lib/TestApp/ControllerRole/Parameterized.pm
new file mode 100644 (file)
index 0000000..9e047db
--- /dev/null
@@ -0,0 +1,11 @@
+use CatalystX::Declare;
+
+controller_role TestApp::ControllerRole::Parameterized (Str :$message) {
+
+    method get_message { $message }
+
+    final action greet under base {
+        no warnings 'uninitialized'; # remove if TODO is fixed
+        $ctx->response->body( join ':', $self->get_message, $message );
+    }
+}