Odd code nit
[p5sagit/p5-mst-13.2.git] / lib / vars.pm
CommitLineData
c07a80fd 1package vars;
2
fb73857a 3require 5.002;
4
b75c8c73 5our $VERSION = '1.00';
6
fb73857a 7# The following require can't be removed during maintenance
8# releases, sadly, because of the risk of buggy code that does
9# require Carp; Carp::croak "..."; without brackets dying
10# if Carp hasn't been loaded in earlier compile time. :-(
11# We'll let those bugs get found on the development track.
12require Carp if $] < 5.00450;
3d842d7f 13
14use warnings::register;
1d76c68a 15require strict;
fb73857a 16
17sub import {
18 my $callpack = caller;
386f5e9f 19 my ($pack, @imports) = @_;
20 my ($sym, $ch);
7eb43e02 21 foreach (@imports) {
22 ($ch, $sym) = unpack('a1a*', $_);
014aafb8 23 if ($sym =~ tr/A-Za-z_0-9//c) {
15313f9c 24 # time for a more-detailed check-up
7eb43e02 25 if ($sym =~ /^\w+[[{].*[]}]$/) {
15313f9c 26 require Carp;
27 Carp::croak("Can't declare individual elements of hash or array");
d3a7d8c7 28 } elsif (warnings::enabled() and length($sym) == 1 and $sym !~ tr/a-zA-Z//) {
29 warnings::warn("No need to declare built-in vars");
1d76c68a 30 } elsif ( $^H &= strict::bits('vars') ) {
7eb43e02 31 Carp::croak("'$_' is not a valid variable name under strict vars");
15313f9c 32 }
33 }
7eb43e02 34 $sym = "${callpack}::$sym" unless $sym =~ /::/;
35 *$sym =
36 ( $ch eq "\$" ? \$$sym
37 : $ch eq "\@" ? \@$sym
38 : $ch eq "\%" ? \%$sym
39 : $ch eq "\*" ? \*$sym
40 : $ch eq "\&" ? \&$sym
fb73857a 41 : do {
42 require Carp;
7eb43e02 43 Carp::croak("'$_' is not a valid variable name");
fb73857a 44 });
45 }
46};
47
481;
49__END__
50
c07a80fd 51=head1 NAME
52
86a9aef2 53vars - Perl pragma to predeclare global variable names (obsolete)
c07a80fd 54
55=head1 SYNOPSIS
56
57 use vars qw($frob @mung %seen);
58
59=head1 DESCRIPTION
60
7eb43e02 61NOTE: For variables in the current package, the functionality provided
62by this pragma has been superseded by C<our> declarations, available
63in Perl v5.6.0 or later. See L<perlfunc/our>.
86a9aef2 64
c07a80fd 65This will predeclare all the variables whose names are
66in the list, allowing you to use them under "use strict", and
67disabling any typo warnings.
68
55497cff 69Unlike pragmas that affect the C<$^H> hints variable, the C<use vars> and
70C<use subs> declarations are not BLOCK-scoped. They are thus effective
71for the entire file in which they appear. You may not rescind such
72declarations with C<no vars> or C<no subs>.
73
7a2e2cd6 74Packages such as the B<AutoLoader> and B<SelfLoader> that delay
75loading of subroutines within packages can create problems with
76package lexicals defined using C<my()>. While the B<vars> pragma
77cannot duplicate the effect of package lexicals (total transparency
78outside of the package), it can act as an acceptable substitute by
79pre-declaring global symbols, ensuring their availability to the
80later-loaded routines.
c6f23971 81
ee580363 82See L<perlmodlib/Pragmatic Modules>.
c07a80fd 83
84=cut