X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F001_mouse%2F047-attribute-metaclass-role.t;fp=t%2F001_mouse%2F047-attribute-metaclass-role.t;h=d621d48e0de5fa22cf23986644d9fd5a7d6e62b7;hb=920139b3efca66d2caeeef306c97fa0da62c6b73;hp=0000000000000000000000000000000000000000;hpb=b644ef5d28f6076859080482d8b44727c1410e1c;p=gitmo%2FMouse.git diff --git a/t/001_mouse/047-attribute-metaclass-role.t b/t/001_mouse/047-attribute-metaclass-role.t new file mode 100644 index 0000000..d621d48 --- /dev/null +++ b/t/001_mouse/047-attribute-metaclass-role.t @@ -0,0 +1,98 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use Test::More tests => 7; +use lib 't/lib'; + +do { + package MouseX::AttributeHelpers::Number; + use Mouse; + extends 'Mouse::Meta::Attribute'; + + has provides => ( + is => 'rw', + isa => 'HashRef', + ); + + after 'install_accessors' => sub{ + my ($attr) = @_; + + my %provides = %{$attr->{provides}}; + my $method_constructors = { + add => sub { + my ($attr, $name) = @_; + return sub { + $_[0]->$name( $_[0]->$name() + $_[1]) + }; + }, + }; + while (my ($name, $aliased) = each %provides) { + $attr->associated_class->add_method( + $aliased => $method_constructors->{$name}->($attr, $attr->name) + ); + } + return $attr; + }; + + package + Mouse::Meta::Attribute::Custom::MyNumber; + sub register_implementation { 'MouseX::AttributeHelpers::Number' } + + 1; + + package Foo; + use Mouse::Role; + + has 'i' => ( + metaclass => 'MyNumber', + is => 'rw', + isa => 'Int', + provides => { + 'add' => 'add_number' + }, + ); + sub f_m {} + + package Bar; + use Mouse::Role; + + has 'j' => ( + metaclass => 'MyNumber', + is => 'rw', + isa => 'Int', + provides => { + 'add' => 'add_number_j' + }, + ); + sub b_m {} + + package Klass1; + use Mouse; + with 'Foo'; + + package Klass2; + use Mouse; + with 'Foo', 'Bar'; + +}; + +{ + # normal + can_ok 'Klass1', 'add_number'; + my $k = Klass1->new(i=>3); + $k->add_number(4); + is $k->i, 7; +} + +{ + # combine + can_ok 'Klass2', 'f_m'; + can_ok 'Klass2', 'b_m'; + can_ok 'Klass2', 'add_number'; + can_ok 'Klass2', 'add_number_j'; + my $k = Klass2->new(i=>3); + $k->add_number(4); + is $k->i, 7; +} + +