bump version
[p5sagit/Import-Into.git] / lib / Import / Into.pm
CommitLineData
2afb5246 1package Import::Into;
2
3use strict;
4use warnings FATAL => 'all';
5
70f752de 6our $VERSION = '1.002001'; # 1.2.1
2afb5246 7
324e7017 8sub _prelude {
10074211 9 my $target = shift;
568eef3e 10 my ($package, $file, $line, $level)
11 = ref $target ? @{$target}{qw(package filename line)}
12 : $target =~ /[^0-9]/ ? ($target)
13 : (undef, undef, undef, $target);
14 if (defined $level) {
15 my ($p, $fn, $ln) = caller($level + 2);
16 $package ||= $p;
17 $file ||= $fn;
18 $line ||= $ln;
19 }
324e7017 20 qq{package $package;\n}
ac6d2081 21 . ($file ? "#line $line \"$file\"\n" : '')
10074211 22}
10074211 23
5f5f09b1 24sub _make_action {
25 my ($action, $target) = @_;
568eef3e 26 my $version = ref $target && $target->{version};
27 my $ver_check = $version ? '$_[0]->VERSION($version);' : '';
28 eval _prelude($target).qq{sub { $ver_check shift->$action(\@_) }}
5f5f09b1 29 or die "Failed to build action sub to ${action} for ${target}: $@";
30}
31
2afb5246 32sub import::into {
33 my ($class, $target, @args) = @_;
5f5f09b1 34 _make_action(import => $target)->($class, @args);
10074211 35}
36
37sub unimport::out_of {
38 my ($class, $target, @args) = @_;
5f5f09b1 39 _make_action(unimport => $target)->($class, @args);
2afb5246 40}
41
421;
74957c98 43
44__END__
45
2afb5246 46=head1 NAME
47
074eb8db 48Import::Into - import packages into other packages
2afb5246 49
50=head1 SYNOPSIS
51
52 package My::MultiExporter;
53
e0ff3439 54 use Import::Into;
55
2afb5246 56 use Thing1 ();
57 use Thing2 ();
58
074eb8db 59 # simple
60 sub import {
61 Thing1->import::into(scalar caller);
62 }
63
64 # multiple
2afb5246 65 sub import {
66 my $target = caller;
67 Thing1->import::into($target);
68 Thing2->import::into($target, qw(import arguments));
69 }
70
074eb8db 71 # by level
8c17b6f8 72 sub import {
074eb8db 73 Thing1->import::into(1);
8c17b6f8 74 }
75
074eb8db 76 # with exporter
8c17b6f8 77 use base qw(Exporter);
8c17b6f8 78 sub import {
79 shift->export_to_level(1);
074eb8db 80 Thing1->import::into(1);
8c17b6f8 81 }
82
074eb8db 83 # no My::MultiExporter == no Thing1
10074211 84 sub unimport {
074eb8db 85 Thing1->unimport::out_of(scalar caller);
10074211 86 }
87
2b421571 88People wanting to re-export your module should also be using L<Import::Into>.
89Any exporter or pragma will work seamlessly.
074eb8db 90
74957c98 91Note: You do B<not> need to make any changes to Thing1 to be able to call
074eb8db 92C<import::into> on it. This is a global method, and is callable on any
93package (and in fact on any object as well, although it's rarer that you'd
94want to do that).
aa5ad642 95
e0ff3439 96=head1 DESCRIPTION
97
98Writing exporters is a pain. Some use L<Exporter>, some use L<Sub::Exporter>,
99some use L<Moose::Exporter>, some use L<Exporter::Declare> ... and some things
100are pragmas.
101
074eb8db 102Exporting on someone else's behalf is harder. The exporters don't provide a
103consistent API for this, and pragmas need to have their import method called
104directly, since they effect the current unit of compilation.
105
106C<Import::Into> provides global methods to make this painless.
107
108=head1 METHODS
109
110=head2 $package->import::into( $target, @arguments );
111
112A global method, callable on any package. Imports the given package into
113C<$target>. C<@arguments> are passed along to the package's import method.
114
74957c98 115C<$target> can be an package name to export to, an integer for the
116caller level to export to, or a hashref with the following options:
074eb8db 117
118=over 4
119
120=item package
121
122The target package to export to.
123
124=item filename
125
74957c98 126The apparent filename to export to. Some exporting modules, such as
127L<autodie> or L<strictures>, care about the filename they are being imported
128to.
074eb8db 129
130=item line
131
74957c98 132The apparent line number to export to. To be combined with the C<filename>
133option.
074eb8db 134
135=item level
136
74957c98 137The caller level to export to. This will automatically populate the
138C<package>, C<filename>, and C<line> options, making it the easiest most
139constent option.
074eb8db 140
141=item version
142
74957c98 143A version number to check for the module. The equivalent of specifying the
144version number on a C<use> line.
074eb8db 145
146=back
147
148=head2 $package->unimport::out_of( $target, @arguments );
149
74957c98 150Equivalent to C<import::into>, but dispatches to C<$package>'s C<unimport>
151method instead of C<import>.
074eb8db 152
153=head1 WHY USE THIS MODULE
154
155The APIs for exporting modules aren't consistent. L<Exporter> subclasses
156provide export_to_level, but if they overrode their import method all bets
157are off. L<Sub::Exporter> provides an into parameter but figuring out
158something used it isn't trivial. Pragmas need to have their C<import> method
159called directly since they affect the current unit of compilation.
e0ff3439 160
161It's ... annoying.
162
163However, there is an approach that actually works for all of these types.
164
165 eval "package $target; use $thing;"
166
167will work for anything checking caller, which is everything except pragmas.
168But it doesn't work for pragmas - pragmas need:
169
170 $thing->import;
171
8c17b6f8 172because they're designed to affect the code currently being compiled - so
173within an eval, that's the scope of the eval itself, not the module that
174just C<use>d you - so
175
176 sub import {
177 eval "use strict;"
178 }
179
180doesn't do what you wanted, but
181
182 sub import {
183 strict->import;
184 }
185
186will apply L<strict> to the calling file correctly.
187
188Of course, now you have two new problems - first, that you still need to
189know if something's a pragma, and second that you can't use either of
190these approaches alone on something like L<Moose> or L<Moo> that's both
191an exporter and a pragma.
192
ba1c5bf0 193So, a solution for that is:
e0ff3439 194
195 my $sub = eval "package $target; sub { shift->import(\@_) }";
196 $sub->($thing, @import_args);
197
198which means that import is called from the right place for pragmas to take
8c17b6f8 199effect, and from the right package for caller checking to work - and so
200behaves correctly for all types of exporter, for pragmas, and for hybrids.
e0ff3439 201
ba1c5bf0 202Additionally, some import routines check the filename they are being imported
203to. This can be dealt with by generating a L<#line directive|perlsyn/Plain
204Old Comments (Not!)> in the eval, which will change what C<caller> reports for
205the filename when called in the importer. The filename and line number to use
206in the directive then need to be fetched using C<caller>:
207
995d8262 208 my ($target, $file, $line) = caller(1);
ba1c5bf0 209 my $sub = eval qq{
210 package $target;
211 #line $line "$file"
212 sub { shift->import(\@_) }
213 };
214 $sub->($thing, @import_args);
215
06bd142d 216And you need to switch between these implementations depending on if you are
217targetting a specific package, or something in your call stack.
218
e0ff3439 219Remembering all this, however, is excessively irritating. So I wrote a module
aa5ad642 220so I didn't have to anymore. Loading L<Import::Into> creates a global method
221C<import::into> which you can call on any package to import it into another
e0ff3439 222package. So now you can simply write:
223
224 use Import::Into;
225
226 $thing->import::into($target, @import_args);
227
aa5ad642 228This works because of how perl resolves method calls - a call to a simple
229method name is resolved against the package of the class or object, so
230
231 $thing->method_name(@args);
232
233is roughly equivalent to:
234
235 my $code_ref = $thing->can('method_name');
236 $code_ref->($thing, @args);
237
238while if a C<::> is found, the lookup is made relative to the package name
239(i.e. everything before the last C<::>) so
240
241 $thing->Package::Name::method_name(@args);
242
243is roughly equivalent to:
244
245 my $code_ref = Package::Name->can('method_name');
246 $code_ref->($thing, @args);
247
248So since L<Import::Into> defines a method C<into> in package C<import>
249the syntax reliably calls that.
250
251For more craziness of this order, have a look at the article I wrote at
252L<http://shadow.cat/blog/matt-s-trout/madness-with-methods> which covers
253coderef abuse and the C<${\...}> syntax.
254
255Final note: You do still need to ensure that you already loaded C<$thing> - if
256you're receiving this from a parameter, I recommend using L<Module::Runtime>:
e0ff3439 257
258 use Import::Into;
259 use Module::Runtime qw(use_module);
260
261 use_module($thing)->import::into($target, @import_args);
262
263And that's it.
264
95ecfed2 265=head1 ACKNOWLEDGEMENTS
266
267Thanks to Getty for asking "how can I get C<< use strict; use warnings; >>
268turned on for all consumers of my code?" and then "why is this not a
269module?!".
270
2afb5246 271=head1 AUTHOR
272
273mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>
274
e0ff3439 275=head1 CONTRIBUTORS
276
93bb9005 277haarg - Graham Knop (cpan:HAARG) <haarg@haarg.org>
e0ff3439 278
2afb5246 279=head1 COPYRIGHT
280
aa5ad642 281Copyright (c) 2012 the Import::Into L</AUTHOR> and L</CONTRIBUTORS>
2afb5246 282as listed above.
283
284=head1 LICENSE
285
286This library is free software and may be distributed under the same terms
287as perl itself.
74957c98 288
289=cut