<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">package deprecate;
use strict;
use warnings;
our $VERSION = 0.02;

# our %Config can ignore %Config::Config, e.g. for testing
our %Config;
unless (%Config) { require Config; *Config = \%Config::Config; }

# Debian-specific change: recommend the separate Debian packages of
# deprecated modules where available

our %DEBIAN_PACKAGES = (
    'Archive::Extract' =&gt; 'libarchive-extract-perl',
    'B::Lint' =&gt; 'libb-lint-perl',
    'B::Lint::Debug' =&gt; 'libb-lint-perl',
    'CPANPLUS::Dist::Build' =&gt; 'libcpanplus-dist-build-perl',
    'CPANPLUS::Dist::Build::Constants' =&gt; 'libcpanplus-dist-build-perl',
    'CPANPLUS' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Backend' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Backend::RV' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Config' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Config::HomeEnv' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Configure' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Configure::Setup' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Dist' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Dist::Autobundle' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Dist::Base' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Dist::MM' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Dist::Sample' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Error' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Internals' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Internals::Constants' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Internals::Constants::Report' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Internals::Extract' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Internals::Fetch' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Internals::Report' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Internals::Search' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Internals::Source' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Internals::Source::Memory' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Internals::Source::SQLite' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Internals::Source::SQLite::Tie' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Internals::Utils' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Internals::Utils::Autoflush' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Module' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Module::Author' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Module::Author::Fake' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Module::Checksums' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Module::Fake' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Module::Signature' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Selfupdate' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Shell' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Shell::Classic' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Shell::Default' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Shell::Default::Plugins::CustomSource' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Shell::Default::Plugins::Remote' =&gt; 'libcpanplus-perl',
    'CPANPLUS::Shell::Default::Plugins::Source' =&gt; 'libcpanplus-perl',
    'File::CheckTree' =&gt; 'libfile-checktree-perl',
    'Log::Message::Simple' =&gt; 'liblog-message-simple-perl',
    'Log::Message' =&gt; 'liblog-message-perl',
    'Log::Message::Config' =&gt; 'liblog-message-perl',
    'Log::Message::Handlers' =&gt; 'liblog-message-perl',
    'Log::Message::Item' =&gt; 'liblog-message-perl',
    'Devel::InnerPackage' =&gt; 'libmodule-pluggable-perl',
    'Module::Pluggable' =&gt; 'libmodule-pluggable-perl',
    'Module::Pluggable::Object' =&gt; 'libmodule-pluggable-perl',
    'Object::Accessor' =&gt; 'libobject-accessor-perl',
    'Pod::LaTeX' =&gt; 'libpod-latex-perl',
    'Term::UI' =&gt; 'libterm-ui-perl',
    'Term::UI::History' =&gt; 'libterm-ui-perl',
    'Text::Soundex' =&gt; 'libtext-soundex-perl',
);

# This isn't a public API. It's internal to code maintained by the perl-porters
# If you would like it to be a public API, please send a patch with
# documentation and tests. Until then, it may change without warning.
sub __loaded_from_core {
    my ($package, $file, $expect_leaf) = @_;

    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 (uc("$priv/$expect_leaf") eq uc($file)) {
	    return 1;
	}
    }
    return 0;
}

sub import {
    my ($package, $file) = caller;

    my $expect_leaf = "$package.pm";
    $expect_leaf =~ s!::!/!g;

    if (__loaded_from_core($package, $file, $expect_leaf)) {
	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(&lt;&lt;"EOM");
Can't find use/require $expect_leaf in caller stack
EOM
	    return;
	}

	# This is fragile, because it
	# is directly poking in the internals of warnings.pm
	my ($call_file, $call_line, $callers_bitmask) = @caller[1,2,9];

	if (defined $callers_bitmask
	    &amp;&amp; (vec($callers_bitmask, $warnings::Offsets{deprecated}, 1)
		|| vec($callers_bitmask, $warnings::Offsets{all}, 1))) {
		if (my $deb = $DEBIAN_PACKAGES{$package}) {
		    warn &lt;&lt;"EOM";
$package will be removed from the Perl core distribution in the next major release. Please install the separate $deb package. It is being used at $call_file, line $call_line.
EOM
		} else {
		    warn &lt;&lt;"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.
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 $] &gt; 5.010, 'deprecate';	# conditionally deprecate the module


=head1 DESCRIPTION

This module is used using C&lt;use deprecate;&gt; (or something that calls
C&lt;&lt; deprecate-&gt;import() &gt;&gt;, for example C&lt;use if COND, deprecate;&gt;).

If the module that includes C&lt;use deprecate&gt; 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&lt;import&gt;, called by C&lt;use deprecate;&gt;.


=head1 SEE ALSO

First example to C&lt;use deprecate;&gt; was L&lt;Switch&gt;.


=head1 AUTHOR

Original version by Nicholas Clark


=head1 COPYRIGHT AND LICENSE

Copyright (C) 2009, 2011

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
</pre></body></html>