add tests for version::is_strict() and version::is_lax()
[p5sagit/p5-mst-13.2.git] / lib / deprecate.pm
index 23c045b..7b92e0b 100644 (file)
@@ -1,12 +1,12 @@
-#!perl -w
-use strict;
-
 package deprecate;
-use Config;
-use Carp;
+use strict;
 use warnings;
 our $VERSION = 0.01;
 
+# our %Config can ignore %Config::Config, e.g. for testing
+our %Config;
+unless (%Config) { require Config; *Config = \%Config::Config; }
+
 sub import {
     my ($package, $file, $line) = caller;
     my $expect_leaf = "$package.pm";
@@ -15,21 +15,37 @@ sub import {
     foreach my $pair ([qw(sitearchexp archlibexp)],
                      [qw(sitelibexp privlibexp)]) {
        my ($site, $priv) = @Config{@$pair};
+       if ($^O eq 'VMS') {
+           for my $d ($site, $priv) { $d = VMS::Filespec::unixify($d) };
+       }
        # Just in case anyone managed to configure with trailing /s
        s!/*$!!g foreach $site, $priv;
 
        next if $site eq $priv;
-       if ("$priv/$expect_leaf" eq $file) {
+       if (uc("$priv/$expect_leaf") eq uc($file)) {
+           my $call_depth=1;
+           my @caller;
+           while (@caller = caller $call_depth++) {
+               last if $caller[7]                      # use/require
+                   and $caller[6] eq $expect_leaf;     # the package file
+           }
+           unless (@caller) {
+               require Carp;
+               Carp::cluck(<<"EOM");
+Can't find use/require $expect_leaf in caller stack
+EOM
+               next;
+           }
+
            # This is fragile, because it
-           # 1: depends on the number of call stacks in if.pm
-           # 2: is directly poking in the internals of warnings.pm
-           my ($call_file, $call_line, $callers_bitmask) = (caller 3)[1,2,9];
+           # is directly poking in the internals of warnings.pm
+           my ($call_file, $call_line, $callers_bitmask) = @caller[1,2,9];
 
            if (defined $callers_bitmask
                && (vec($callers_bitmask, $warnings::Offsets{deprecated}, 1)
                    || vec($callers_bitmask, $warnings::Offsets{all}, 1))) {
                warn <<"EOM";
-$package will be removed from the Perl core distribution in the next major release. Please install it from CPAN. It is being used at $call_file line $call_line
+$package will be removed from the Perl core distribution in the next major release. Please install it from CPAN. It is being used at $call_file, line $call_line.
 EOM
            }
            return;
@@ -38,3 +54,52 @@ EOM
 }
 
 1;
+
+__END__
+
+=head1 NAME
+
+deprecate - Perl pragma for deprecating the core version of a module
+
+=head1 SYNOPSIS
+
+    use deprecate;     # always deprecate the module in which this occurs
+
+    use if $] > 5.010, 'deprecate';    # conditionally deprecate the module
+
+
+=head1 DESCRIPTION
+
+This module is used using C<use deprecate;> (or something that calls
+C<< deprecate->import() >>, for example C<use if COND, deprecate;>).
+
+If the module that includes C<use deprecate> is located in a core library
+directory, a deprecation warning is issued, encouraging the user to use
+the version on CPAN.  If that module is located in a site library, it is
+the CPAN version, and no warning is issued.
+
+=head2 EXPORT
+
+None by default.  The only method is C<import>, called by C<use deprecate;>.
+
+
+=head1 SEE ALSO
+
+First example to C<use deprecate;> was L<Switch>.
+
+
+=head1 AUTHOR
+
+Original version by Nicholas Clark
+
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (C) 2009 
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself, either Perl version 5.10.0 or,
+at your option, any later version of Perl 5 you may have available.
+
+
+=cut