X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F044-attribute-metaclass.t;fp=t%2F044-attribute-metaclass.t;h=bd9ca8fc06b6c6846f9b0e03fc1cb7c87d0d2bf1;hb=abfdffe0146e788b3b808398fb075231163c3948;hp=0000000000000000000000000000000000000000;hpb=5fa003bf0b3308fd48519ff1173feb778c550c01;p=gitmo%2FMouse.git diff --git a/t/044-attribute-metaclass.t b/t/044-attribute-metaclass.t new file mode 100644 index 0000000..bd9ca8f --- /dev/null +++ b/t/044-attribute-metaclass.t @@ -0,0 +1,55 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use Test::More tests => 2; +use lib 't/lib'; + +do { + package MouseX::AttributeHelpers::Number; + use Mouse; + extends 'Mouse::Meta::Attribute'; + + around 'create' => sub { + my ($next, @args) = @_; + my $attr = $next->(@args); + 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 # hide me from search.cpan.org + Mouse::Meta::Attribute::Custom::Number; + sub register_implementation { 'MouseX::AttributeHelpers::Number' } + + 1; + + package Klass; + use Mouse; + + has 'i' => ( + metaclass => 'Number', + is => 'rw', + isa => 'Int', + provides => { + 'add' => 'add_number' + }, + ); +}; + +can_ok 'Klass', 'add_number'; +my $k = Klass->new(i=>3); +$k->add_number(4); +is $k->i, 7; +