X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F020_attributes%2F010_attribute_delegation.t;h=7e44c454dc0e36c85d85b1b14a7add741df527f2;hb=2de18801c55ae2cfac72d6697e797f3875286d83;hp=2e6e5855142e3864fc7758eb46a823e0c6c5c72f;hpb=e902b1a5df5cddc4bd8ca7236e966fab4d8a6914;p=gitmo%2FMoose.git diff --git a/t/020_attributes/010_attribute_delegation.t b/t/020_attributes/010_attribute_delegation.t index 2e6e585..7e44c45 100644 --- a/t/020_attributes/010_attribute_delegation.t +++ b/t/020_attributes/010_attribute_delegation.t @@ -3,33 +3,34 @@ use strict; use warnings; -use Test::More tests => 85; +use Test::More tests => 89; use Test::Exception; -BEGIN { - use_ok('Moose'); -} + # ------------------------------------------------------------------- # HASH handles # ------------------------------------------------------------------- # the canonical form of of the 'handles' -# option is the hash ref mapping a +# option is the hash ref mapping a # method name to the delegated method name { package Foo; use Moose; - has 'bar' => (is => 'rw', default => 10); + has 'bar' => (is => 'rw', default => 10); package Bar; - use Moose; - + use Moose; + has 'foo' => ( is => 'rw', default => sub { Foo->new }, - handles => { 'foo_bar' => 'bar' } + handles => { + 'foo_bar' => 'bar', + 'foo_bar_to_20' => [ bar => [ 20 ] ], + } ); } @@ -39,6 +40,11 @@ isa_ok($bar, 'Bar'); ok($bar->foo, '... we have something in bar->foo'); isa_ok($bar->foo, 'Foo'); +my $meth = Bar->meta->get_method('foo_bar'); +isa_ok($meth, 'Moose::Meta::Method::Delegation'); +is($meth->associated_attribute->name, 'foo', + 'associated_attribute->name for this method is foo'); + is($bar->foo->bar, 10, '... bar->foo->bar returned the right default'); can_ok($bar, 'foo_bar'); @@ -57,7 +63,7 @@ is($bar->foo_bar, 30, '... bar->foo_bar delegated correctly'); $bar->foo_bar(50); -# and make sure everyone sees it +# and make sure everyone sees it is($bar->foo->bar, 50, '... bar->foo->bar returned the right (changed) value'); is($bar->foo_bar, 50, '... bar->foo_bar delegated correctly'); @@ -78,11 +84,15 @@ is($bar->foo, $foo, '... assigned bar->foo with the new Foo'); is($bar->foo->bar, 25, '... bar->foo->bar returned the right result'); is($bar->foo_bar, 25, '... and bar->foo_bar delegated correctly again'); +# curried handles +$bar->foo_bar_to_20; +is($bar->foo_bar, 20, '... correctly curried a single argument'); + # ------------------------------------------------------------------- -# ARRAY handles +# ARRAY handles # ------------------------------------------------------------------- # we also support an array based format -# which assumes that the name is the same +# which assumes that the name is the same # on either end { @@ -90,11 +100,11 @@ is($bar->foo_bar, 25, '... and bar->foo_bar delegated correctly again'); use Moose; sub go { 'Engine::go' } - sub stop { 'Engine::stop' } + sub stop { 'Engine::stop' } package Car; - use Moose; - + use Moose; + has 'engine' => ( is => 'rw', default => sub { Engine->new }, @@ -119,7 +129,7 @@ is($car->go, 'Engine::go', '... got the right value from ->go'); is($car->stop, 'Engine::stop', '... got the right value from ->stop'); # ------------------------------------------------------------------- -# REGEXP handles +# REGEXP handles # ------------------------------------------------------------------- # and we support regexp delegation @@ -128,38 +138,38 @@ is($car->stop, 'Engine::stop', '... got the right value from ->stop'); use Moose; sub foo { 'Baz::foo' } - sub bar { 'Baz::bar' } - sub boo { 'Baz::boo' } + sub bar { 'Baz::bar' } + sub boo { 'Baz::boo' } package Baz::Proxy1; - use Moose; - + use Moose; + has 'baz' => ( is => 'ro', isa => 'Baz', default => sub { Baz->new }, handles => qr/.*/ ); - + package Baz::Proxy2; - use Moose; - + use Moose; + has 'baz' => ( is => 'ro', isa => 'Baz', default => sub { Baz->new }, handles => qr/.oo/ - ); - + ); + package Baz::Proxy3; - use Moose; - + use Moose; + has 'baz' => ( is => 'ro', isa => 'Baz', default => sub { Baz->new }, handles => qr/b.*/ - ); + ); } { @@ -172,10 +182,10 @@ is($car->stop, 'Engine::stop', '... got the right value from ->stop'); can_ok($baz_proxy, 'foo'); can_ok($baz_proxy, 'bar'); can_ok($baz_proxy, 'boo'); - + is($baz_proxy->foo, 'Baz::foo', '... got the right proxied return value'); is($baz_proxy->bar, 'Baz::bar', '... got the right proxied return value'); - is($baz_proxy->boo, 'Baz::boo', '... got the right proxied return value'); + is($baz_proxy->boo, 'Baz::boo', '... got the right proxied return value'); } { my $baz_proxy = Baz::Proxy2->new; @@ -186,9 +196,9 @@ is($car->stop, 'Engine::stop', '... got the right value from ->stop'); can_ok($baz_proxy, 'foo'); can_ok($baz_proxy, 'boo'); - + is($baz_proxy->foo, 'Baz::foo', '... got the right proxied return value'); - is($baz_proxy->boo, 'Baz::boo', '... got the right proxied return value'); + is($baz_proxy->boo, 'Baz::boo', '... got the right proxied return value'); } { my $baz_proxy = Baz::Proxy3->new; @@ -199,9 +209,9 @@ is($car->stop, 'Engine::stop', '... got the right value from ->stop'); can_ok($baz_proxy, 'bar'); can_ok($baz_proxy, 'boo'); - + is($baz_proxy->bar, 'Baz::bar', '... got the right proxied return value'); - is($baz_proxy->boo, 'Baz::boo', '... got the right proxied return value'); + is($baz_proxy->boo, 'Baz::boo', '... got the right proxied return value'); } # ------------------------------------------------------------------- @@ -211,22 +221,22 @@ is($car->stop, 'Engine::stop', '... got the right value from ->stop'); { package Foo::Bar; use Moose::Role; - + requires 'foo'; requires 'bar'; - + package Foo::Baz; use Moose; - + sub foo { 'Foo::Baz::FOO' } sub bar { 'Foo::Baz::BAR' } - sub baz { 'Foo::Baz::BAZ' } - + sub baz { 'Foo::Baz::BAZ' } + package Foo::Thing; use Moose; - + has 'thing' => ( - is => 'rw', + is => 'rw', isa => 'Foo::Baz', handles => 'Foo::Bar', ); @@ -237,14 +247,14 @@ is($car->stop, 'Engine::stop', '... got the right value from ->stop'); my $foo = Foo::Thing->new(thing => Foo::Baz->new); isa_ok($foo, 'Foo::Thing'); isa_ok($foo->thing, 'Foo::Baz'); - + ok($foo->meta->has_method('foo'), '... we have the method we expect'); ok($foo->meta->has_method('bar'), '... we have the method we expect'); - ok(!$foo->meta->has_method('baz'), '... we dont have the method we expect'); - - is($foo->foo, 'Foo::Baz::FOO', '... got the right value'); + ok(!$foo->meta->has_method('baz'), '... we dont have the method we expect'); + + is($foo->foo, 'Foo::Baz::FOO', '... got the right value'); is($foo->bar, 'Foo::Baz::BAR', '... got the right value'); - is($foo->thing->baz, 'Foo::Baz::BAZ', '... got the right value'); + is($foo->thing->baz, 'Foo::Baz::BAZ', '... got the right value'); } # ------------------------------------------------------------------- @@ -269,32 +279,32 @@ is($car->stop, 'Engine::stop', '... got the right value from ->stop'); } package Bar::Autoloaded; - use Moose; - + use Moose; + has 'foo' => ( is => 'rw', default => sub { Foo::Autoloaded->new }, handles => { 'foo_bar' => 'bar' } ); - + package Baz::Autoloaded; - use Moose; - + use Moose; + has 'foo' => ( is => 'rw', default => sub { Foo::Autoloaded->new }, handles => ['bar'] - ); - + ); + package Goorch::Autoloaded; - use Moose; - + use Moose; + ::dies_ok { has 'foo' => ( is => 'rw', default => sub { Foo::Autoloaded->new }, handles => qr/bar/ - ); + ); } '... you cannot delegate to AUTOLOADED class with regexp'; } @@ -320,7 +330,7 @@ is($car->stop, 'Engine::stop', '... got the right value from ->stop'); $bar->foo_bar(50); - # and make sure everyone sees it + # and make sure everyone sees it is($bar->foo->bar, 50, '... bar->foo->bar returned the right (changed) value'); is($bar->foo_bar, 50, '... bar->foo_bar delegated correctly'); @@ -331,7 +341,7 @@ is($car->stop, 'Engine::stop', '... got the right value from ->stop'); isa_ok($foo, 'Foo::Autoloaded'); $foo->bar(25); - + is($foo->bar, 25, '... got the right foo->bar'); lives_ok { @@ -366,7 +376,7 @@ is($car->stop, 'Engine::stop', '... got the right value from ->stop'); $baz->bar(50); - # and make sure everyone sees it + # and make sure everyone sees it is($baz->foo->bar, 50, '... baz->foo->bar returned the right (changed) value'); is($baz->bar, 50, '... baz->foo_bar delegated correctly'); @@ -377,7 +387,7 @@ is($car->stop, 'Engine::stop', '... got the right value from ->stop'); isa_ok($foo, 'Foo::Autoloaded'); $foo->bar(25); - + is($foo->bar, 25, '... got the right foo->bar'); lives_ok { @@ -389,3 +399,21 @@ is($car->stop, 'Engine::stop', '... got the right value from ->stop'); is($baz->foo->bar, 25, '... baz->foo->bar returned the right result'); is($baz->bar, 25, '... and baz->foo_bar delegated correctly again'); } + +# Check that removing attributes removes their handles methods also. +{ + { + package Quux; + use Moose; + has foo => ( + isa => 'Foo', + default => sub { Foo->new }, + handles => { 'foo_bar' => 'bar' } + ); + } + my $i = Quux->new; + ok($i->meta->has_method('foo_bar'), 'handles method foo_bar is present'); + $i->meta->remove_attribute('foo'); + ok(!$i->meta->has_method('foo_bar'), 'handles method foo_bar is removed'); +} +