X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F003_methods.t;h=5088f50a0d0a20d4d0d149926ebf9ffb78fcda95;hb=1550e0820d345fd483382e2b912ba683da3bdc1d;hp=26e63891024e3a8ed8ab68837f5253bcfc2803f4;hpb=3976fb78d652db94c091ae2d6151045632d032ef;p=gitmo%2FClass-MOP.git diff --git a/t/003_methods.t b/t/003_methods.t index 26e6389..5088f50 100644 --- a/t/003_methods.t +++ b/t/003_methods.t @@ -1,26 +1,15 @@ -#!/usr/bin/perl - use strict; use warnings; -use Test::More; +use Test::More tests => 67; use Test::Exception; use Scalar::Util qw/reftype/; +use Sub::Name; -BEGIN { - if ( eval 'use Sub::Name (); 1;' ) { - plan tests => 65; - } - else { - plan skip_all => 'These tests require Sub::Name'; - } -} - -BEGIN { - use_ok('Class::MOP'); - use_ok('Class::MOP::Class'); -} +use Class::MOP; +use Class::MOP::Class; +use Class::MOP::Method; { # This package tries to test &has_method # as exhaustively as possible. More corner @@ -74,8 +63,8 @@ BEGIN { my $Foo = Class::MOP::Class->initialize('Foo'); -ok(!$Foo->has_method('pie'), '... got the method stub pie'); -ok(!$Foo->has_method('cake'), '... got the constant method stub cake'); +ok($Foo->has_method('pie'), '... got the method stub pie'); +ok($Foo->has_method('cake'), '... got the constant method stub cake'); my $foo = sub { 'Foo::foo' }; @@ -95,6 +84,7 @@ is($foo_method->package_name, 'Foo', '... got the right package name for the met ok($Foo->has_method('foo'), '... Foo->has_method(foo) (defined with Sub::Name)'); is($Foo->get_method('foo')->body, $foo, '... Foo->get_method(foo) == \&foo'); +is($Foo->get_method('foo')->execute, 'Foo::foo', '... _method_foo->execute returns "Foo::foo"'); is(Foo->foo(), 'Foo::foo', '... Foo->foo() returns "Foo::foo"'); # now check all our other items ... @@ -155,7 +145,7 @@ for my $method_name (qw/ $Foo->alias_method('alias_me' => Foo::Aliasing->meta->get_method('alias_me')); -ok(!$Foo->has_method('alias_me'), '... !Foo->has_method(alias_me) (aliased from Foo::Aliasing)'); +ok($Foo->has_method('alias_me'), '... Foo->has_method(alias_me) (aliased from Foo::Aliasing)'); ok(defined &Foo::alias_me, '... Foo does have a symbol table slow for alias_me though'); ok(!$Foo->has_method('blessed'), '... !Foo->has_method(blessed) (imported into Foo)'); @@ -166,46 +156,44 @@ is($Foo->get_method('not_a_real_method'), undef, '... Foo->get_method(not_a_real is_deeply( [ sort $Foo->get_method_list ], - [ qw(FOO_CONSTANT baaz bang bar baz blah evaled_foo floob foo) ], + [ qw(FOO_CONSTANT alias_me baaz bang bar baz blah cake evaled_foo floob foo pie) ], '... got the right method list for Foo'); is_deeply( - [ sort { $a->{name} cmp $b->{name} } $Foo->compute_all_applicable_methods() ], + [ sort { $a->name cmp $b->name } $Foo->get_all_methods() ], [ - map { - { - name => $_, - class => 'Foo', - code => $Foo->get_method($_) - } - } qw( + map { $Foo->get_method($_) } qw( FOO_CONSTANT + alias_me baaz bang bar baz blah + cake evaled_foo floob foo + pie ) ], '... got the right list of applicable methods for Foo'); is($Foo->remove_method('foo')->body, $foo, '... removed the foo method'); ok(!$Foo->has_method('foo'), '... !Foo->has_method(foo) we just removed it'); +ok(!$Foo->get_method_map->{foo}, 'foo is not in the method map'); dies_ok { Foo->foo } '... cannot call Foo->foo because it is not there'; is_deeply( [ sort $Foo->get_method_list ], - [ qw(FOO_CONSTANT baaz bang bar baz blah evaled_foo floob) ], + [ qw(FOO_CONSTANT alias_me baaz bang bar baz blah cake evaled_foo floob pie) ], '... got the right method list for Foo'); # ... test our class creator my $Bar = Class::MOP::Class->create( - name => 'Bar', + package => 'Bar', superclasses => [ 'Foo' ], methods => { foo => sub { 'Bar::foo' }, @@ -233,51 +221,35 @@ is_deeply( '... got the right method list for Bar'); is_deeply( - [ sort { $a->{name} cmp $b->{name} } $Bar->compute_all_applicable_methods() ], + [ sort { $a->name cmp $b->name } $Bar->get_all_methods() ], [ - { - name => 'FOO_CONSTANT', - class => 'Foo', - code => $Foo->get_method('FOO_CONSTANT') - }, - { - name => 'baaz', - class => 'Foo', - code => $Foo->get_method('baaz') - }, - { - name => 'bang', - class => 'Foo', - code => $Foo->get_method('bang') - }, - { - name => 'bar', - class => 'Bar', - code => $Bar->get_method('bar') - }, - (map { - { - name => $_, - class => 'Foo', - code => $Foo->get_method($_) - } - } qw( + $Foo->get_method('FOO_CONSTANT'), + $Foo->get_method('alias_me'), + $Foo->get_method('baaz'), + $Foo->get_method('bang'), + $Bar->get_method('bar'), + (map { $Foo->get_method($_) } qw( baz blah + cake evaled_foo floob )), - { - name => 'foo', - class => 'Bar', - code => $Bar->get_method('foo') - }, - { - name => 'meta', - class => 'Bar', - code => $Bar->get_method('meta') - } + $Bar->get_method('foo'), + $Bar->get_method('meta'), + $Foo->get_method('pie'), ], '... got the right list of applicable methods for Bar'); +my $method = Class::MOP::Method->wrap( + name => 'objecty', + package_name => 'Whatever', + body => sub {q{I am an object, and I feel an object's pain}}, +); + +Bar->meta->add_method( $method->name, $method ); + +my $new_method = Bar->meta->get_method('objecty'); +isnt( $method, $new_method, 'add_method clones method objects as they are added' ); +is( $new_method->original_method, $method, '... the cloned method has the correct original method' );