Commit | Line | Data |
de19f115 |
1 | #!/usr/bin/perl |
2 | |
3 | use strict; |
4 | use warnings; |
5 | |
e5698763 |
6 | use Test::More tests => 24; |
de19f115 |
7 | use Test::Exception; |
8 | |
e5698763 |
9 | use Class::MOP; |
10 | use Class::MOP::Method; |
de19f115 |
11 | |
855d2774 |
12 | # test before and afters |
13 | { |
14 | my $trace = ''; |
de19f115 |
15 | |
b38f3848 |
16 | my $method = Class::MOP::Method->wrap( |
5caf45ce |
17 | body => sub { $trace .= 'primary' }, |
b38f3848 |
18 | package_name => 'main', |
19 | name => '__ANON__', |
20 | ); |
855d2774 |
21 | isa_ok($method, 'Class::MOP::Method'); |
de19f115 |
22 | |
855d2774 |
23 | $method->(); |
24 | is($trace, 'primary', '... got the right return value from method'); |
25 | $trace = ''; |
de19f115 |
26 | |
ddc8edba |
27 | my $wrapped = Class::MOP::Method::Wrapped->wrap($method); |
28 | isa_ok($wrapped, 'Class::MOP::Method::Wrapped'); |
855d2774 |
29 | isa_ok($wrapped, 'Class::MOP::Method'); |
30 | |
31 | $wrapped->(); |
32 | is($trace, 'primary', '... got the right return value from the wrapped method'); |
33 | $trace = ''; |
34 | |
35 | lives_ok { |
36 | $wrapped->add_before_modifier(sub { $trace .= 'before -> ' }); |
37 | } '... added the before modifier okay'; |
38 | |
39 | $wrapped->(); |
40 | is($trace, 'before -> primary', '... got the right return value from the wrapped method (w/ before)'); |
41 | $trace = ''; |
42 | |
43 | lives_ok { |
44 | $wrapped->add_after_modifier(sub { $trace .= ' -> after' }); |
45 | } '... added the after modifier okay'; |
46 | |
47 | $wrapped->(); |
48 | is($trace, 'before -> primary -> after', '... got the right return value from the wrapped method (w/ before)'); |
49 | $trace = ''; |
50 | } |
51 | |
52 | # test around method |
53 | { |
b38f3848 |
54 | my $method = Class::MOP::Method->wrap( |
55 | sub { 4 }, |
56 | package_name => 'main', |
57 | name => '__ANON__', |
58 | ); |
855d2774 |
59 | isa_ok($method, 'Class::MOP::Method'); |
60 | |
61 | is($method->(), 4, '... got the right value from the wrapped method'); |
62 | |
ddc8edba |
63 | my $wrapped = Class::MOP::Method::Wrapped->wrap($method); |
64 | isa_ok($wrapped, 'Class::MOP::Method::Wrapped'); |
855d2774 |
65 | isa_ok($wrapped, 'Class::MOP::Method'); |
66 | |
67 | is($wrapped->(), 4, '... got the right value from the wrapped method'); |
68 | |
69 | lives_ok { |
70 | $wrapped->add_around_modifier(sub { (3, $_[0]->()) }); |
71 | $wrapped->add_around_modifier(sub { (2, $_[0]->()) }); |
72 | $wrapped->add_around_modifier(sub { (1, $_[0]->()) }); |
8768d570 |
73 | $wrapped->add_around_modifier(sub { (0, $_[0]->()) }); |
855d2774 |
74 | } '... added the around modifier okay'; |
75 | |
76 | is_deeply( |
77 | [ $wrapped->() ], |
8768d570 |
78 | [ 0, 1, 2, 3, 4 ], |
79 | '... got the right results back from the around methods (in list context)'); |
80 | |
81 | is(scalar $wrapped->(), 4, '... got the right results back from the around methods (in scalar context)'); |
855d2774 |
82 | } |
de19f115 |
83 | |
ee5e71d4 |
84 | { |
85 | my @tracelog; |
86 | |
b38f3848 |
87 | my $method = Class::MOP::Method->wrap( |
88 | sub { push @tracelog => 'primary' }, |
89 | package_name => 'main', |
90 | name => '__ANON__', |
91 | ); |
ee5e71d4 |
92 | isa_ok($method, 'Class::MOP::Method'); |
93 | |
ddc8edba |
94 | my $wrapped = Class::MOP::Method::Wrapped->wrap($method); |
95 | isa_ok($wrapped, 'Class::MOP::Method::Wrapped'); |
ee5e71d4 |
96 | isa_ok($wrapped, 'Class::MOP::Method'); |
97 | |
98 | lives_ok { |
99 | $wrapped->add_before_modifier(sub { push @tracelog => 'before 1' }); |
100 | $wrapped->add_before_modifier(sub { push @tracelog => 'before 2' }); |
101 | $wrapped->add_before_modifier(sub { push @tracelog => 'before 3' }); |
102 | } '... added the before modifier okay'; |
103 | |
104 | lives_ok { |
96ceced8 |
105 | $wrapped->add_around_modifier(sub { push @tracelog => 'around 1'; $_[0]->(); }); |
ee5e71d4 |
106 | $wrapped->add_around_modifier(sub { push @tracelog => 'around 2'; $_[0]->(); }); |
96ceced8 |
107 | $wrapped->add_around_modifier(sub { push @tracelog => 'around 3'; $_[0]->(); }); |
ee5e71d4 |
108 | } '... added the around modifier okay'; |
109 | |
110 | lives_ok { |
96ceced8 |
111 | $wrapped->add_after_modifier(sub { push @tracelog => 'after 1' }); |
ee5e71d4 |
112 | $wrapped->add_after_modifier(sub { push @tracelog => 'after 2' }); |
96ceced8 |
113 | $wrapped->add_after_modifier(sub { push @tracelog => 'after 3' }); |
ee5e71d4 |
114 | } '... added the after modifier okay'; |
115 | |
116 | $wrapped->(); |
117 | is_deeply( |
118 | \@tracelog, |
119 | [ |
120 | 'before 3', 'before 2', 'before 1', # last-in-first-out order |
96ceced8 |
121 | 'around 3', 'around 2', 'around 1', # last-in-first-out order |
ee5e71d4 |
122 | 'primary', |
96ceced8 |
123 | 'after 1', 'after 2', 'after 3', # first-in-first-out order |
ee5e71d4 |
124 | ], |
125 | '... got the right tracelog from all our before/around/after methods'); |
126 | } |
de19f115 |
127 | |
de19f115 |
128 | |
de19f115 |
129 | |