App-SimpleBackuper
view release on metacpan or search on metacpan
local/lib/perl5/Module/Implementation.pm view on Meta::CPAN
package Module::Implementation;
# git description: v0.08-2-gd599347
$Module::Implementation::VERSION = '0.09';
use strict;
use warnings;
use Module::Runtime 0.012 qw( require_module );
use Try::Tiny;
# This is needed for the benefit of Test::CleanNamespaces, which in turn loads
# Package::Stash, which in turn loads this module and expects a minimum
# version.
unless ( exists $Module::Implementation::{VERSION}
&& ${ $Module::Implementation::{VERSION} } ) {
$Module::Implementation::{VERSION} = \42;
}
my %Implementation;
sub build_loader_sub {
my $caller = caller();
return _build_loader( $caller, @_ );
}
sub _build_loader {
my $package = shift;
my %args = @_;
my @implementations = @{ $args{implementations} };
my @symbols = @{ $args{symbols} || [] };
my $implementation;
my $env_var = uc $package;
$env_var =~ s/::/_/g;
$env_var .= '_IMPLEMENTATION';
return sub {
my ( $implementation, $loaded ) = _load_implementation(
$package,
$ENV{$env_var},
\@implementations,
);
$Implementation{$package} = $implementation;
_copy_symbols( $loaded, $package, \@symbols );
return $loaded;
};
}
sub implementation_for {
my $package = shift;
return $Implementation{$package};
}
sub _load_implementation {
my $package = shift;
my $env_value = shift;
my $implementations = shift;
if ($env_value) {
die "$env_value is not a valid implementation for $package"
unless grep { $_ eq $env_value } @{$implementations};
( run in 0.448 second using v1.01-cache-2.11-cpan-39bf76dae61 )