7dbb2de8b573298f83e687882dd573d65eb5044d
[gitmo/Mouse.git] / t / 047-attribute-metaclass-role.t
1 #!/usr/bin/env perl
2 use strict;
3 use warnings;
4 use Test::More tests => 7;
5 use lib 't/lib';
6
7 do {
8     package MouseX::AttributeHelpers::Number;
9     use Mouse;
10     extends 'Mouse::Meta::Attribute';
11
12     sub create {
13         my ($self, @args) = @_;
14         my $attr = $self->SUPER::create(@args);
15         my %provides = %{$attr->{provides}};
16         my $method_constructors = {
17             add => sub {
18                 my ($attr, $name) = @_;
19                 return sub {
20                     $_[0]->$name( $_[0]->$name() + $_[1])
21                 };
22             },
23         };
24         while (my ($name, $aliased) = each %provides) {
25             $attr->associated_class->add_method(
26                 $aliased => $method_constructors->{$name}->($attr, $attr->name)
27             );
28         }
29         return $attr;
30     };
31
32     package # hide me from search.cpan.org
33         Mouse::Meta::Attribute::Custom::Number;
34     sub register_implementation { 'MouseX::AttributeHelpers::Number' }
35
36     1;
37     
38     package Foo;
39     use Mouse::Role;
40
41     has 'i' => (
42         metaclass => 'Number',
43         is => 'rw',
44         isa => 'Int',
45         provides => {
46             'add' => 'add_number'
47         },
48     );
49     sub f_m {}
50
51     package Bar;
52     use Mouse::Role;
53
54     has 'j' => (
55         metaclass => 'Number',
56         is => 'rw',
57         isa => 'Int',
58         provides => {
59             'add' => 'add_number_j'
60         },
61     );
62     sub b_m {}
63
64     package Klass1;
65     use Mouse;
66     with 'Foo';
67
68     package Klass2;
69     use Mouse;
70     with 'Foo', 'Bar';
71
72 };
73
74 {
75     # normal
76     can_ok 'Klass1', 'add_number';
77     my $k = Klass1->new(i=>3);
78     $k->add_number(4);
79     is $k->i, 7;
80 }
81
82 {
83     # combine
84     can_ok 'Klass2', 'f_m';
85     can_ok 'Klass2', 'b_m';
86     can_ok 'Klass2', 'add_number';
87     can_ok 'Klass2', 'add_number_j';
88     my $k = Klass2->new(i=>3);
89     $k->add_number(4);
90     is $k->i, 7;
91 }
92