[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
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';
use MooseX::Declare;
+use MooseX::Role::Parameterized ();
class CatalystX::Declare::Keyword::Action
with MooseX::Declare::Syntax::KeywordHandling {
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;
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) {
}
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;
}
});
}
}
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) };
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'),
--- /dev/null
+#!/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;
--- /dev/null
+use CatalystX::Declare;
+
+controller TestApp::Controller::Parameterized is mutable {
+ with 'TestApp::ControllerRole::Parameterized' => { message => 'foo' };
+
+ action base under '/' as 'param';
+}
--- /dev/null
+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 );
+ }
+}