Implement strict constructors, which will warn unkown constructor arguments
[gitmo/Mouse.git] / t / 001_mouse / 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
a09601ab 12 has provides => (
13 is => 'rw',
14 isa => 'HashRef',
15 );
16
17 after 'install_accessors' => sub{
18 my ($attr) = @_;
19
05b9dc92 20 my %provides = %{$attr->{provides}};
21 my $method_constructors = {
22 add => sub {
23 my ($attr, $name) = @_;
24 return sub {
25 $_[0]->$name( $_[0]->$name() + $_[1])
26 };
27 },
28 };
29 while (my ($name, $aliased) = each %provides) {
30 $attr->associated_class->add_method(
31 $aliased => $method_constructors->{$name}->($attr, $attr->name)
32 );
33 }
34 return $attr;
35 };
36
a09601ab 37 package
38 Mouse::Meta::Attribute::Custom::MyNumber;
05b9dc92 39 sub register_implementation { 'MouseX::AttributeHelpers::Number' }
40
41 1;
42
43 package Foo;
44 use Mouse::Role;
45
46 has 'i' => (
a09601ab 47 metaclass => 'MyNumber',
05b9dc92 48 is => 'rw',
49 isa => 'Int',
50 provides => {
51 'add' => 'add_number'
52 },
53 );
54 sub f_m {}
55
56 package Bar;
57 use Mouse::Role;
58
59 has 'j' => (
a09601ab 60 metaclass => 'MyNumber',
05b9dc92 61 is => 'rw',
62 isa => 'Int',
63 provides => {
64 'add' => 'add_number_j'
65 },
66 );
67 sub b_m {}
68
69 package Klass1;
70 use Mouse;
71 with 'Foo';
72
73 package Klass2;
74 use Mouse;
75 with 'Foo', 'Bar';
76
77};
78
79{
80 # normal
81 can_ok 'Klass1', 'add_number';
82 my $k = Klass1->new(i=>3);
83 $k->add_number(4);
84 is $k->i, 7;
85}
86
87{
88 # combine
89 can_ok 'Klass2', 'f_m';
90 can_ok 'Klass2', 'b_m';
91 can_ok 'Klass2', 'add_number';
92 can_ok 'Klass2', 'add_number_j';
93 my $k = Klass2->new(i=>3);
94 $k->add_number(4);
95 is $k->i, 7;
96}
97
1b9e472d 98