Commit | Line | Data |
4403da90 |
1 | #!/usr/bin/perl |
2 | |
3 | use strict; |
4 | use warnings; |
5 | |
5d193eb8 |
6 | use Test::More tests => 38; |
4403da90 |
7 | use Test::Exception; |
8 | |
2c9c8797 |
9 | |
4403da90 |
10 | { |
11 | package MooseX::Empty; |
12 | |
13 | use Moose (); |
2c9c8797 |
14 | Moose::Exporter->build_import_methods( also => 'Moose' ); |
4403da90 |
15 | } |
16 | |
17 | { |
18 | package WantsMoose; |
19 | |
2c9c8797 |
20 | MooseX::Empty->import(); |
4403da90 |
21 | |
22 | sub foo { 1 } |
23 | |
2c9c8797 |
24 | ::can_ok( 'WantsMoose', 'has' ); |
25 | ::can_ok( 'WantsMoose', 'with' ); |
26 | ::can_ok( 'WantsMoose', 'foo' ); |
4403da90 |
27 | |
2c9c8797 |
28 | MooseX::Empty->unimport(); |
4403da90 |
29 | } |
30 | |
31 | { |
2c9c8797 |
32 | # Note: it's important that these methods be out of scope _now_, |
33 | # after unimport was called. We tried a |
34 | # namespace::clean(0.08)-based solution, but had to abandon it |
35 | # because it cleans the namespace _later_ (when the file scope |
36 | # ends). |
4403da90 |
37 | ok( ! WantsMoose->can('has'), 'WantsMoose::has() has been cleaned' ); |
38 | ok( ! WantsMoose->can('with'), 'WantsMoose::with() has been cleaned' ); |
39 | can_ok( 'WantsMoose', 'foo' ); |
42c391b1 |
40 | |
41 | # This makes sure that Moose->init_meta() happens properly |
42 | isa_ok( WantsMoose->meta(), 'Moose::Meta::Class' ); |
43 | isa_ok( WantsMoose->new(), 'Moose::Object' ); |
44 | |
4403da90 |
45 | } |
46 | |
47 | { |
48 | package MooseX::Sugar; |
49 | |
50 | use Moose (); |
51 | |
52 | sub wrapped1 { |
53 | my $caller = shift; |
54 | return $caller . ' called wrapped1'; |
55 | } |
56 | |
2c9c8797 |
57 | Moose::Exporter->build_import_methods( |
58 | with_caller => ['wrapped1'], |
59 | also => 'Moose', |
60 | ); |
4403da90 |
61 | } |
62 | |
63 | { |
64 | package WantsSugar; |
65 | |
2c9c8797 |
66 | MooseX::Sugar->import(); |
4403da90 |
67 | |
68 | sub foo { 1 } |
69 | |
2c9c8797 |
70 | ::can_ok( 'WantsSugar', 'has' ); |
71 | ::can_ok( 'WantsSugar', 'with' ); |
72 | ::can_ok( 'WantsSugar', 'wrapped1' ); |
73 | ::can_ok( 'WantsSugar', 'foo' ); |
74 | ::is( wrapped1(), 'WantsSugar called wrapped1', |
75 | 'wrapped1 identifies the caller correctly' ); |
4403da90 |
76 | |
2c9c8797 |
77 | MooseX::Sugar->unimport(); |
4403da90 |
78 | } |
79 | |
80 | { |
81 | ok( ! WantsSugar->can('has'), 'WantsSugar::has() has been cleaned' ); |
82 | ok( ! WantsSugar->can('with'), 'WantsSugar::with() has been cleaned' ); |
83 | ok( ! WantsSugar->can('wrapped1'), 'WantsSugar::wrapped1() has been cleaned' ); |
84 | can_ok( 'WantsSugar', 'foo' ); |
85 | } |
86 | |
87 | { |
88 | package MooseX::MoreSugar; |
89 | |
90 | use Moose (); |
91 | |
92 | sub wrapped2 { |
93 | my $caller = shift; |
94 | return $caller . ' called wrapped2'; |
95 | } |
96 | |
97 | sub as_is1 { |
98 | return 'as_is1'; |
99 | } |
100 | |
2c9c8797 |
101 | Moose::Exporter->build_import_methods( |
102 | with_caller => ['wrapped2'], |
103 | as_is => ['as_is1'], |
104 | also => 'MooseX::Sugar', |
105 | ); |
4403da90 |
106 | } |
107 | |
108 | { |
109 | package WantsMoreSugar; |
110 | |
2c9c8797 |
111 | MooseX::MoreSugar->import(); |
4403da90 |
112 | |
113 | sub foo { 1 } |
114 | |
2c9c8797 |
115 | ::can_ok( 'WantsMoreSugar', 'has' ); |
116 | ::can_ok( 'WantsMoreSugar', 'with' ); |
117 | ::can_ok( 'WantsMoreSugar', 'wrapped1' ); |
118 | ::can_ok( 'WantsMoreSugar', 'wrapped2' ); |
119 | ::can_ok( 'WantsMoreSugar', 'as_is1' ); |
120 | ::can_ok( 'WantsMoreSugar', 'foo' ); |
121 | ::is( wrapped1(), 'WantsMoreSugar called wrapped1', |
122 | 'wrapped1 identifies the caller correctly' ); |
123 | ::is( wrapped2(), 'WantsMoreSugar called wrapped2', |
124 | 'wrapped2 identifies the caller correctly' ); |
125 | ::is( as_is1(), 'as_is1', |
126 | 'as_is1 works as expected' ); |
127 | |
128 | MooseX::MoreSugar->unimport(); |
4403da90 |
129 | } |
130 | |
131 | { |
132 | ok( ! WantsMoreSugar->can('has'), 'WantsMoreSugar::has() has been cleaned' ); |
133 | ok( ! WantsMoreSugar->can('with'), 'WantsMoreSugar::with() has been cleaned' ); |
134 | ok( ! WantsMoreSugar->can('wrapped1'), 'WantsMoreSugar::wrapped1() has been cleaned' ); |
135 | ok( ! WantsMoreSugar->can('wrapped2'), 'WantsMoreSugar::wrapped2() has been cleaned' ); |
136 | ok( ! WantsMoreSugar->can('as_is1'), 'WantsMoreSugar::as_is1() has been cleaned' ); |
137 | can_ok( 'WantsMoreSugar', 'foo' ); |
138 | } |
139 | |
140 | { |
085fba61 |
141 | package My::Metaclass; |
142 | use Moose; |
143 | BEGIN { extends 'Moose::Meta::Class' } |
144 | |
145 | package My::Object; |
146 | use Moose; |
147 | BEGIN { extends 'Moose::Object' } |
148 | |
149 | package HasInitMeta; |
150 | |
151 | use Moose (); |
152 | |
153 | sub init_meta { |
154 | shift; |
155 | return Moose->init_meta( @_, |
156 | metaclass => 'My::Metaclass', |
157 | base_class => 'My::Object', |
158 | ); |
159 | } |
160 | |
2c9c8797 |
161 | Moose::Exporter->build_import_methods( also => 'Moose' ); |
085fba61 |
162 | } |
163 | |
164 | { |
165 | package NewMeta; |
166 | |
2c9c8797 |
167 | HasInitMeta->import(); |
085fba61 |
168 | } |
169 | |
170 | { |
171 | isa_ok( NewMeta->meta(), 'My::Metaclass' ); |
172 | isa_ok( NewMeta->new(), 'My::Object' ); |
173 | } |
174 | |
175 | { |
4403da90 |
176 | package MooseX::CircularAlso; |
177 | |
178 | use Moose (); |
179 | |
180 | ::dies_ok( |
181 | sub { |
182 | Moose::Exporter->build_import_methods( |
183 | also => [ 'Moose', 'MooseX::CircularAlso' ], |
184 | ); |
185 | }, |
186 | 'a circular reference in also dies with an error' |
187 | ); |
188 | |
189 | ::like( |
190 | $@, |
191 | qr/\QCircular reference in also parameter to MooseX::Exporter between MooseX::CircularAlso and MooseX::CircularAlso/, |
192 | 'got the expected error from circular reference in also' |
193 | ); |
194 | } |
195 | |
196 | { |
197 | package MooseX::CircularAlso; |
198 | |
199 | use Moose (); |
200 | |
201 | ::dies_ok( |
202 | sub { |
203 | Moose::Exporter->build_import_methods( |
204 | also => [ 'NoSuchThing' ], |
205 | ); |
206 | }, |
207 | 'a package which does not use Moose::Exporter in also dies with an error' |
208 | ); |
209 | |
210 | ::like( |
211 | $@, |
212 | qr/\QPackage in also (NoSuchThing) does not seem to use MooseX::Exporter/, |
213 | 'got the expected error from a reference in also to a package which does not use Moose::Exporter' |
214 | ); |
215 | } |