summaryrefslogtreecommitdiffstats
path: root/lib/Package/Stash.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Package/Stash.pm')
-rw-r--r--lib/Package/Stash.pm35
1 files changed, 8 insertions, 27 deletions
diff --git a/lib/Package/Stash.pm b/lib/Package/Stash.pm
index 08a5e13..8a3fa9f 100644
--- a/lib/Package/Stash.pm
+++ b/lib/Package/Stash.pm
@@ -6,35 +6,16 @@ use 5.008001;
our $IMPLEMENTATION;
+use Module::Implementation;
+
BEGIN {
- $IMPLEMENTATION = $ENV{PACKAGE_STASH_IMPLEMENTATION}
- if exists $ENV{PACKAGE_STASH_IMPLEMENTATION};
-
- my $err;
- if ($IMPLEMENTATION) {
- my $file = "Package::Stash::$IMPLEMENTATION.pm";
- $file =~ s{::}{/}g;
- if (!eval 'require($file) ; 1') {
- require Carp;
- Carp::croak("Could not load Package::Stash::$IMPLEMENTATION: $@");
- }
- }
- else {
- for my $impl ('XS', 'PP') {
- if (eval "require Package::Stash::$impl; 1;") {
- $IMPLEMENTATION = $impl;
- last;
- }
- else {
- $err .= $@;
- }
- }
- }
+ local $ENV{PACKAGE_STASH_IMPLEMENTATION} = $IMPLEMENTATION
+ if ( $IMPLEMENTATION and not $ENV{PACKAGE_STASH_IMPLEMENTATION} );
- if (!$IMPLEMENTATION) {
- require Carp;
- Carp::croak("Could not find a suitable Package::Stash implementation: $err");
- }
+ Module::Implementation::build_loader_sub(
+ implementations => [ 'XS', 'PP' ]
+ )->();
+ $IMPLEMENTATION = Module::Implementation::implementation_for(__PACKAGE__);
my $impl = "Package::Stash::$IMPLEMENTATION";
my $from = $impl->new($impl);