File: 030_method.t

package info (click to toggle)
libclass-mop-perl 1.04-1
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 1,244 kB
  • ctags: 1,272
  • sloc: perl: 5,192; ansic: 241; makefile: 2
file content (163 lines) | stat: -rw-r--r-- 5,143 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
use strict;
use warnings;

use Test::More;
use Test::Exception;

use Class::MOP;
use Class::MOP::Method;

my $method = Class::MOP::Method->wrap(
    sub {1},
    package_name => 'main',
    name         => '__ANON__',
);
is( $method->meta, Class::MOP::Method->meta,
    '... instance and class both lead to the same meta' );

is( $method->package_name, 'main',     '... our package is main::' );
is( $method->name,         '__ANON__', '... our sub name is __ANON__' );
is( $method->fully_qualified_name, 'main::__ANON__',
    '... our subs full name is main::__ANON__' );
is( $method->original_method, undef, '... no original_method ' );
is( $method->original_package_name, 'main',
    '... the original_package_name is the same as package_name' );
is( $method->original_name, '__ANON__',
    '... the original_name is the same as name' );
is( $method->original_fully_qualified_name, 'main::__ANON__',
    '... the original_fully_qualified_name is the same as fully_qualified_name'
);

dies_ok { Class::MOP::Method->wrap }
q{... can't call wrap() without some code};
dies_ok { Class::MOP::Method->wrap( [] ) }
q{... can't call wrap() without some code};
dies_ok { Class::MOP::Method->wrap( bless {} => 'Fail' ) }
q{... can't call wrap() without some code};

dies_ok { Class::MOP::Method->name }
q{... can't call name() as a class method};
dies_ok { Class::MOP::Method->body }
q{... can't call body() as a class method};
dies_ok { Class::MOP::Method->package_name }
q{... can't call package_name() as a class method};
dies_ok { Class::MOP::Method->fully_qualified_name }
q{... can't call fully_qualified_name() as a class method};

my $meta = Class::MOP::Method->meta;
isa_ok( $meta, 'Class::MOP::Class' );

foreach my $method_name (
    qw(
    wrap
    package_name
    name
    )
    ) {
    ok( $meta->has_method($method_name),
        '... Class::MOP::Method->has_method(' . $method_name . ')' );
    my $method = $meta->get_method($method_name);
    is( $method->package_name, 'Class::MOP::Method',
        '... our package is Class::MOP::Method' );
    is( $method->name, $method_name,
        '... our sub name is "' . $method_name . '"' );
}

dies_ok {
    Class::MOP::Method->wrap();
}
'... bad args for &wrap';

dies_ok {
    Class::MOP::Method->wrap('Fail');
}
'... bad args for &wrap';

dies_ok {
    Class::MOP::Method->wrap( [] );
}
'... bad args for &wrap';

dies_ok {
    Class::MOP::Method->wrap( sub {'FAIL'} );
}
'... bad args for &wrap';

dies_ok {
    Class::MOP::Method->wrap( sub {'FAIL'}, package_name => 'main' );
}
'... bad args for &wrap';

dies_ok {
    Class::MOP::Method->wrap( sub {'FAIL'}, name => '__ANON__' );
}
'... bad args for &wrap';

lives_ok {
    Class::MOP::Method->wrap( bless( sub {'FAIL'}, "Foo" ),
        name => '__ANON__', package_name => 'Foo::Bar' );
}
'... blessed coderef to &wrap';

my $clone = $method->clone(
    package_name => 'NewPackage',
    name         => 'new_name',
);

isa_ok( $clone, 'Class::MOP::Method' );
is( $clone->package_name, 'NewPackage',
    '... cloned method has new package name' );
is( $clone->name, 'new_name', '... cloned method has new sub name' );
is( $clone->fully_qualified_name, 'NewPackage::new_name',
    '... cloned method has new fq name' );
is( $clone->original_method, $method,
    '... cloned method has correct original_method' );
is( $clone->original_package_name, 'main',
    '... cloned method has correct original_package_name' );
is( $clone->original_name, '__ANON__',
    '... cloned method has correct original_name' );
is( $clone->original_fully_qualified_name, 'main::__ANON__',
    '... cloned method has correct original_fully_qualified_name' );

my $clone2 = $clone->clone(
    package_name => 'NewerPackage',
    name         => 'newer_name',
);

is( $clone2->package_name, 'NewerPackage',
    '... clone of clone has new package name' );
is( $clone2->name, 'newer_name', '... clone of clone has new sub name' );
is( $clone2->fully_qualified_name, 'NewerPackage::newer_name',
    '... clone of clone new fq name' );
is( $clone2->original_method, $clone,
    '... cloned method has correct original_method' );
is( $clone2->original_package_name, 'main',
    '... original_package_name follows clone chain' );
is( $clone2->original_name, '__ANON__',
    '... original_name follows clone chain' );
is( $clone2->original_fully_qualified_name, 'main::__ANON__',
    '... original_fully_qualified_name follows clone chain' );

Class::MOP::Class->create(
    'Method::Subclass',
    superclasses => ['Class::MOP::Method'],
    attributes   => [
        Class::MOP::Attribute->new(
            foo => (
                accessor => 'foo',
            )
        ),
    ],
);

my $wrapped = Method::Subclass->wrap($method, foo => 'bar');
isa_ok($wrapped, 'Method::Subclass');
isa_ok($wrapped, 'Class::MOP::Method');
is($wrapped->foo, 'bar', 'attribute set properly');
is($wrapped->package_name, 'main', 'package_name copied properly');
is($wrapped->name, '__ANON__', 'method name copied properly');

my $wrapped2 = Method::Subclass->wrap($method, foo => 'baz', name => 'FOO');
is($wrapped2->name, 'FOO', 'got a new method name');

done_testing;