Fix Makefile.PL to use Mouse::Spec
[gitmo/Mouse.git] / t / 047-attribute-metaclass-role.t
CommitLineData
05b9dc92 1#!/usr/bin/env perl
2use strict;
3use warnings;
4use Test::More tests => 7;
5use lib 't/lib';
6
7do {
8 package MouseX::AttributeHelpers::Number;
9 use Mouse;
10 extends 'Mouse::Meta::Attribute';
11
b769bed5 12 sub create {
13 my ($self, @args) = @_;
14 my $attr = $self->SUPER::create(@args);
05b9dc92 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