File Coverage

blib/lib/Module/Runtime.pm
Criterion Covered Total %
statement 55 55 100.0
branch 30 32 93.7
condition 11 15 73.3
subroutine 15 15 100.0
pod 9 9 100.0
total 120 126 95.2


line stmt bran cond sub pod time code
1             =head1 NAME
2              
3             Module::Runtime - runtime module handling
4              
5             =head1 SYNOPSIS
6              
7             use Module::Runtime qw(
8             $module_name_rx is_module_name check_module_name
9             module_notional_filename require_module
10             );
11              
12             if($module_name =~ /\A$module_name_rx\z/o) { ...
13             if(is_module_name($module_name)) { ...
14             check_module_name($module_name);
15              
16             $notional_filename = module_notional_filename($module_name);
17             require_module($module_name);
18              
19             use Module::Runtime qw(use_module use_package_optimistically);
20              
21             $bi = use_module("Math::BigInt", 1.31)->new("1_234");
22             $widget = use_package_optimistically("Local::Widget")->new;
23              
24             use Module::Runtime qw(
25             $top_module_spec_rx $sub_module_spec_rx
26             is_module_spec check_module_spec
27             compose_module_name
28             );
29              
30             if($spec =~ /\A$top_module_spec_rx\z/o) { ...
31             if($spec =~ /\A$sub_module_spec_rx\z/o) { ...
32             if(is_module_spec("Standard::Prefix", $spec)) { ...
33             check_module_spec("Standard::Prefix", $spec);
34              
35             $module_name =
36             compose_module_name("Standard::Prefix", $spec);
37              
38             =head1 DESCRIPTION
39              
40             The functions exported by this module deal with runtime handling of
41             Perl modules, which are normally handled at compile time. This module
42             avoids using any other modules, so that it can be used in low-level
43             infrastructure.
44              
45             The parts of this module that work with module names apply the same syntax
46             that is used for barewords in Perl source. In principle this syntax
47             can vary between versions of Perl, and this module applies the syntax of
48             the Perl on which it is running. In practice the usable syntax hasn't
49             changed yet. There's some intent for Unicode module names to be supported
50             in the future, but this hasn't yet amounted to any consistent facility.
51              
52             The functions of this module whose purpose is to load modules include
53             workarounds for three old Perl core bugs regarding C. These
54             workarounds are applied on any Perl version where the bugs exist, except
55             for a case where one of the bugs cannot be adequately worked around in
56             pure Perl.
57              
58             =head2 Module name syntax
59              
60             The usable module name syntax has not changed from Perl 5.000 up to
61             Perl 5.19.8. The syntax is composed entirely of ASCII characters.
62             From Perl 5.6 onwards there has been some attempt to allow the use of
63             non-ASCII Unicode characters in Perl source, but it was fundamentally
64             broken (like the entirety of Perl 5.6's Unicode handling) and remained
65             pretty much entirely unusable until it got some attention in the Perl
66             5.15 series. Although Unicode is now consistently accepted by the
67             parser in some places, it remains broken for module names. Furthermore,
68             there has not yet been any work on how to map Unicode module names into
69             filenames, so in that respect also Unicode module names are unusable.
70              
71             The module name syntax is, precisely: the string must consist of one or
72             more segments separated by C<::>; each segment must consist of one or more
73             identifier characters (ASCII alphanumerics plus "_"); the first character
74             of the string must not be a digit. Thus "C", "C",
75             and "C" are all valid module names, whereas "C"
76             and "C<1foo::bar>" are not. C<'> separators are not permitted by this
77             module, though they remain usable in Perl source, being translated to
78             C<::> in the parser.
79              
80             =head2 Core bugs worked around
81              
82             The first bug worked around is core bug [perl #68590], which causes
83             lexical state in one file to leak into another that is Cd/Cd
84             from it. This bug is present from Perl 5.6 up to Perl 5.10, and is
85             fixed in Perl 5.11.0. From Perl 5.9.4 up to Perl 5.10.0 no satisfactory
86             workaround is possible in pure Perl. The workaround means that modules
87             loaded via this module don't suffer this pollution of their lexical
88             state. Modules loaded in other ways, or via this module on the Perl
89             versions where the pure Perl workaround is impossible, remain vulnerable.
90             The module L provides a complete workaround
91             for this bug.
92              
93             The second bug worked around causes some kinds of failure in module
94             loading, principally compilation errors in the loaded module, to be
95             recorded in C<%INC> as if they were successful, so later attempts to load
96             the same module immediately indicate success. This bug is present up
97             to Perl 5.8.9, and is fixed in Perl 5.9.0. The workaround means that a
98             compilation error in a module loaded via this module won't be cached as
99             a success. Modules loaded in other ways remain liable to produce bogus
100             C<%INC> entries, and if a bogus entry exists then it will mislead this
101             module if it is used to re-attempt loading.
102              
103             The third bug worked around causes the wrong context to be seen at
104             file scope of a loaded module, if C is invoked in a location
105             that inherits context from a higher scope. This bug is present up to
106             Perl 5.11.2, and is fixed in Perl 5.11.3. The workaround means that
107             a module loaded via this module will always see the correct context.
108             Modules loaded in other ways remain vulnerable.
109              
110             =cut
111              
112             package Module::Runtime;
113              
114             # Don't "use 5.006" here, because Perl 5.15.6 will load feature.pm if
115             # the version check is done that way.
116 11     11   199527 BEGIN { require 5.006; }
117             # Don't "use warnings" here, to avoid dependencies. Do standardise the
118             # warning status by lexical override; unfortunately the only safe bitset
119             # to build in is the empty set, equivalent to "no warnings".
120 11     11   9844 BEGIN { ${^WARNING_BITS} = ""; }
121             # Don't "use strict" here, to avoid dependencies.
122              
123             our $VERSION = "0.015";
124              
125             # Don't use Exporter here, to avoid dependencies.
126             our @EXPORT_OK = qw(
127             $module_name_rx is_module_name is_valid_module_name check_module_name
128             module_notional_filename require_module
129             use_module use_package_optimistically
130             $top_module_spec_rx $sub_module_spec_rx
131             is_module_spec is_valid_module_spec check_module_spec
132             compose_module_name
133             );
134             my %export_ok = map { ($_ => undef) } @EXPORT_OK;
135             sub import {
136 15     15   1895 my $me = shift;
137 15         53 my $callpkg = caller(0);
138 15         40 my $errs = "";
139 15         49 foreach(@_) {
140 26 100       111 if(exists $export_ok{$_}) {
141             # We would need to do "no strict 'refs'" here
142             # if we had enabled strict at file scope.
143 22 100       103 if(/\A\$(.*)\z/s) {
144 3         18 *{$callpkg."::".$1} = \$$1;
  3         26  
145             } else {
146 19         65 *{$callpkg."::".$_} = \&$_;
  19         171  
147             }
148             } else {
149 4         13 $errs .= "\"$_\" is not exported by the $me module\n";
150             }
151             }
152 15 100       378 if($errs ne "") {
153 3         6 die "${errs}Can't continue after import errors ".
154 3         21 "at @{[(caller(0))[1]]} line @{[(caller(0))[2]]}.\n";
  3         48  
155             }
156             }
157              
158             # Logic duplicated from Params::Classify. Duplicating it here avoids
159             # an extensive and potentially circular dependency graph.
160             sub _is_string($) {
161 307     307   907 my($arg) = @_;
162 307   100     5688 return defined($arg) && ref(\$arg) eq "SCALAR";
163             }
164              
165             =head1 REGULAR EXPRESSIONS
166              
167             These regular expressions do not include any anchors, so to check
168             whether an entire string matches a syntax item you must supply the
169             anchors yourself.
170              
171             =over
172              
173             =item $module_name_rx
174              
175             Matches a valid Perl module name in bareword syntax.
176              
177             =cut
178              
179             our $module_name_rx = qr/[A-Z_a-z][0-9A-Z_a-z]*(?:::[0-9A-Z_a-z]+)*/;
180              
181             =item $top_module_spec_rx
182              
183             Matches a module specification for use with L,
184             where no prefix is being used.
185              
186             =cut
187              
188             my $qual_module_spec_rx =
189             qr#(?:/|::)[A-Z_a-z][0-9A-Z_a-z]*(?:(?:/|::)[0-9A-Z_a-z]+)*#;
190              
191             my $unqual_top_module_spec_rx =
192             qr#[A-Z_a-z][0-9A-Z_a-z]*(?:(?:/|::)[0-9A-Z_a-z]+)*#;
193              
194             our $top_module_spec_rx = qr/$qual_module_spec_rx|$unqual_top_module_spec_rx/o;
195              
196             =item $sub_module_spec_rx
197              
198             Matches a module specification for use with L,
199             where a prefix is being used.
200              
201             =cut
202              
203             my $unqual_sub_module_spec_rx = qr#[0-9A-Z_a-z]+(?:(?:/|::)[0-9A-Z_a-z]+)*#;
204              
205             our $sub_module_spec_rx = qr/$qual_module_spec_rx|$unqual_sub_module_spec_rx/o;
206              
207             =back
208              
209             =head1 FUNCTIONS
210              
211             =head2 Basic module handling
212              
213             =over
214              
215             =item is_module_name(ARG)
216              
217             Returns a truth value indicating whether I is a plain string
218             satisfying Perl module name syntax as described for L.
219              
220             =cut
221              
222 151 100   151 1 18228 sub is_module_name($) { _is_string($_[0]) && $_[0] =~ /\A$module_name_rx\z/o }
223              
224             =item is_valid_module_name(ARG)
225              
226             Deprecated alias for L.
227              
228             =cut
229              
230             *is_valid_module_name = \&is_module_name;
231              
232             =item check_module_name(ARG)
233              
234             Check whether I is a plain string
235             satisfying Perl module name syntax as described for L.
236             Return normally if it is, or C if it is not.
237              
238             =cut
239              
240             sub check_module_name($) {
241 134 100   134 1 358 unless(&is_module_name) {
242 12 100       43 die +(_is_string($_[0]) ? "`$_[0]'" : "argument").
243             " is not a module name\n";
244             }
245             }
246              
247             =item module_notional_filename(NAME)
248              
249             Generates a notional relative filename for a module, which is used in
250             some Perl core interfaces.
251             The I is a string, which should be a valid module name (one or
252             more C<::>-separated segments). If it is not a valid name, the function
253             Cs.
254              
255             The notional filename for the named module is generated and returned.
256             This filename is always in Unix style, with C directory separators
257             and a C<.pm> suffix. This kind of filename can be used as an argument to
258             C, and is the key that appears in C<%INC> to identify a module,
259             regardless of actual local filename syntax.
260              
261             =cut
262              
263             sub module_notional_filename($) {
264 109     109 1 356 &check_module_name;
265 109         383 my($name) = @_;
266 109         499 $name =~ s!::!/!g;
267 109         16233 return $name.".pm";
268             }
269              
270             =item require_module(NAME)
271              
272             This is essentially the bareword form of C, in runtime form.
273             The I is a string, which should be a valid module name (one or
274             more C<::>-separated segments). If it is not a valid name, the function
275             Cs.
276              
277             The module specified by I is loaded, if it hasn't been already,
278             in the manner of the bareword form of C. That means that a
279             search through C<@INC> is performed, and a byte-compiled form of the
280             module will be used if available.
281              
282             The return value is as for C. That is, it is the value returned
283             by the module itself if the module is loaded anew, or C<1> if the module
284             was already loaded.
285              
286             =cut
287              
288             # Don't "use constant" here, to avoid dependencies.
289             BEGIN {
290             *_WORK_AROUND_HINT_LEAKAGE =
291             "$]" < 5.011 && !("$]" >= 5.009004 && "$]" < 5.010001)
292 11 50 33 11   161 ? sub(){1} : sub(){0};
293 11 50       553 *_WORK_AROUND_BROKEN_MODULE_STATE = "$]" < 5.009 ? sub(){1} : sub(){0};
294             }
295              
296 11     11   6995 BEGIN { if(_WORK_AROUND_BROKEN_MODULE_STATE) { eval q{
297             sub Module::Runtime::__GUARD__::DESTROY {
298             delete $INC{$_[0]->[0]} if @{$_[0]};
299             }
300             1;
301             }; die $@ if $@ ne ""; } }
302              
303             sub require_module($) {
304             # Localise %^H to work around [perl #68590], where the bug exists
305             # and this is a satisfactory workaround. The bug consists of
306             # %^H state leaking into each required module, polluting the
307             # module's lexical state.
308 68     68 1 38088 local %^H if _WORK_AROUND_HINT_LEAKAGE;
309 68         189 if(_WORK_AROUND_BROKEN_MODULE_STATE) {
310             my $notional_filename = &module_notional_filename;
311             my $guard = bless([ $notional_filename ],
312             "Module::Runtime::__GUARD__");
313             my $result = CORE::require($notional_filename);
314             pop @$guard;
315             return $result;
316             } else {
317 68         191 return scalar(CORE::require(&module_notional_filename));
318             }
319             }
320              
321             =back
322              
323             =head2 Structured module use
324              
325             =over
326              
327             =item use_module(NAME[, VERSION])
328              
329             This is essentially C in runtime form, but without the importing
330             feature (which is fundamentally a compile-time thing). The I is
331             handled just like in C above: it must be a module name,
332             and the named module is loaded as if by the bareword form of C.
333              
334             If a I is specified, the C method of the loaded module is
335             called with the specified I as an argument. This normally serves to
336             ensure that the version loaded is at least the version required. This is
337             the same functionality provided by the I parameter of C.
338              
339             On success, the name of the module is returned. This is unlike
340             L, and is done so that the entire call to L
341             can be used as a class name to call a constructor, as in the example in
342             the synopsis.
343              
344             =cut
345              
346             sub use_module($;$) {
347 17     17 1 23800 my($name, $version) = @_;
348 17         67 require_module($name);
349 13 100       24999 $name->VERSION($version) if @_ >= 2;
350 12         109 return $name;
351             }
352              
353             =item use_package_optimistically(NAME[, VERSION])
354              
355             This is an analogue of L for the situation where there is
356             uncertainty as to whether a package/class is defined in its own module
357             or by some other means. It attempts to arrange for the named package to
358             be available, either by loading a module or by doing nothing and hoping.
359              
360             An attempt is made to load the named module (as if by the bareword form
361             of C). If the module cannot be found then it is assumed that
362             the package was actually already loaded by other means, and no error
363             is signalled. That's the optimistic bit.
364              
365             I this optional module loading is liable to cause unreliable
366             behaviour, including security problems. It interacts especially badly
367             with having C<.> in C<@INC>, which was the default state of affairs in
368             Perls prior to 5.25.11. If a package is actually defined by some means
369             other than a module, then applying this function to it causes a spurious
370             attempt to load a module that is expected to be non-existent. If a
371             module actually exists under that name then it will be unintentionally
372             loaded. If C<.> is in C<@INC> and this code is ever run with the current
373             directory being one writable by a malicious user (such as F), then
374             the malicious user can easily cause the victim to run arbitrary code, by
375             creating a module file under the predictable spuriously-loaded name in the
376             writable directory. Generally, optional module loading should be avoided.
377              
378             This is mostly the same operation that is performed by the L pragma
379             to ensure that the specified base classes are available. The behaviour
380             of L was simplified in version 2.18, and later improved in version
381             2.20, and on both occasions this function changed to match.
382              
383             If a I is specified, the C method of the loaded package is
384             called with the specified I as an argument. This normally serves
385             to ensure that the version loaded is at least the version required.
386             On success, the name of the package is returned. These aspects of the
387             function work just like L.
388              
389             =cut
390              
391             sub use_package_optimistically($;$) {
392 37     37 1 61897 my($name, $version) = @_;
393 37         132 my $fn = module_notional_filename($name);
394 37         101 eval { local $SIG{__DIE__}; require_module($name); };
  37         177  
  37         128  
395 37 100 66     62823 die $@ if $@ ne "" &&
      66        
396             ($@ !~ /\ACan't locate \Q$fn\E .+ at \Q@{[__FILE__]}\E line/s ||
397             $@ =~ /^Compilation\ failed\ in\ require
398             \ at\ \Q@{[__FILE__]}\E\ line/xm);
399 24 100       253 $name->VERSION($version) if @_ >= 2;
400 22         236 return $name;
401             }
402              
403             =back
404              
405             =head2 Module name composition
406              
407             =over
408              
409             =item is_module_spec(PREFIX, SPEC)
410              
411             Returns a truth value indicating
412             whether I is valid input for L.
413             See below for what that entails. Whether a I is supplied affects
414             the validity of I, but the exact value of the prefix is unimportant,
415             so this function treats I as a truth value.
416              
417             =cut
418              
419             sub is_module_spec($$) {
420 116     116 1 73293 my($prefix, $spec) = @_;
421 116   100     476 return _is_string($spec) &&
422             $spec =~ ($prefix ? qr/\A$sub_module_spec_rx\z/o :
423             qr/\A$top_module_spec_rx\z/o);
424             }
425              
426             =item is_valid_module_spec(PREFIX, SPEC)
427              
428             Deprecated alias for L.
429              
430             =cut
431              
432             *is_valid_module_spec = \&is_module_spec;
433              
434             =item check_module_spec(PREFIX, SPEC)
435              
436             Check whether I is valid input for L.
437             Return normally if it is, or C if it is not.
438              
439             =cut
440              
441             sub check_module_spec($$) {
442 66 100   66 1 183 unless(&is_module_spec) {
443 28 100       103 die +(_is_string($_[1]) ? "`$_[1]'" : "argument").
444             " is not a module specification\n";
445             }
446             }
447              
448             =item compose_module_name(PREFIX, SPEC)
449              
450             This function is intended to make it more convenient for a user to specify
451             a Perl module name at runtime. Users have greater need for abbreviations
452             and context-sensitivity than programmers, and Perl module names get a
453             little unwieldy. I is what the user specifies, and this function
454             translates it into a module name in standard form, which it returns.
455              
456             I has syntax approximately that of a standard module name: it
457             should consist of one or more name segments, each of which consists
458             of one or more identifier characters. However, C is permitted as a
459             separator, in addition to the standard C<::>. The two separators are
460             entirely interchangeable.
461              
462             Additionally, if I is not C then it must be a module
463             name in standard form, and it is prefixed to the user-specified name.
464             The user can inhibit the prefix addition by starting I with a
465             separator (either C or C<::>).
466              
467             =cut
468              
469             sub compose_module_name($$) {
470 16     16 1 49 my($prefix, $spec) = @_;
471 16 100       54 check_module_name($prefix) if defined $prefix;
472 16         43 &check_module_spec;
473 16 100       65 if($spec =~ s#\A(?:/|::)##) {
474             # OK
475             } else {
476 8 100       23 $spec = $prefix."::".$spec if defined $prefix;
477             }
478 16         41 $spec =~ s#/#::#g;
479 16         67 return $spec;
480             }
481              
482             =back
483              
484             =head1 BUGS
485              
486             On Perl versions 5.7.2 to 5.8.8, if C is overridden by the
487             C mechanism, it is likely to break the heuristics used by
488             L, making it signal an error for a missing
489             module rather than assume that it was already loaded. From Perl 5.8.9
490             onwards, and on 5.7.1 and earlier, this module can avoid being confused
491             by such an override. On the affected versions, a C override
492             might be installed by L, if something requires
493             its bugfix but for some reason its XS implementation isn't available.
494              
495             =head1 SEE ALSO
496              
497             L,
498             L,
499             L,
500             L
501              
502             =head1 AUTHOR
503              
504             Andrew Main (Zefram)
505              
506             =head1 COPYRIGHT
507              
508             Copyright (C) 2004, 2006, 2007, 2009, 2010, 2011, 2012, 2014, 2017
509             Andrew Main (Zefram)
510              
511             =head1 LICENSE
512              
513             This module is free software; you can redistribute it and/or modify it
514             under the same terms as Perl itself.
515              
516             =cut
517              
518             1;