It turns out namespace::clean's different semantics break some code
[gitmo/Moose.git] / t / 050_metaclasses / 012_moose_exporter.t
CommitLineData
4403da90 1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
5d193eb8 6use Test::More tests => 38;
4403da90 7use 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}