summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorToby Inkster <mail@tobyinkster.co.uk>2022-09-12 19:34:37 +0100
committerToby Inkster <mail@tobyinkster.co.uk>2022-09-12 19:34:37 +0100
commit142c6a70a14d371cc919c8ce70390196a858c574 (patch)
treed32dde992617a59996bd9fb7289c8ddd510cc5e3 /lib
parent53a24b1a91535735ba98ec646c4fb508d42f0a53 (diff)
More readable way to pick an implementation
Diffstat (limited to 'lib')
-rw-r--r--lib/Eval/TypeTiny.pm37
1 files changed, 27 insertions, 10 deletions
diff --git a/lib/Eval/TypeTiny.pm b/lib/Eval/TypeTiny.pm
index 371374d2..11554dbc 100644
--- a/lib/Eval/TypeTiny.pm
+++ b/lib/Eval/TypeTiny.pm
@@ -17,6 +17,22 @@ BEGIN {
*NICE_PROTOTYPES = ( $] >= 5.014 ) ? sub () { !!1 } : sub () { !!0 };
}
+sub _pick_alternative {
+ my $ok = 0;
+ while ( @_ ) {
+ my ( $type, $condition, $result ) = splice @_, 0, 3;
+ if ( $type eq 'needs' ) {
+ ++$ok if eval "require $condition; 1";
+ }
+ elsif ( $type eq 'if' ) {
+ ++$ok if $condition;
+ }
+ next unless $ok;
+ return ref( $result ) ? $result->() : $result;
+ }
+ return;
+}
+
{
sub IMPLEMENTATION_DEVEL_LEXALIAS () { 'Devel::LexAlias' }
sub IMPLEMENTATION_PADWALKER () { 'PadWalker' }
@@ -28,12 +44,12 @@ BEGIN {
#<<<
# uncoverable subroutine
sub ALIAS_IMPLEMENTATION () {
- $implementation ||= do {
- do { $] ge '5.022' } ? IMPLEMENTATION_NATIVE :
- eval { require Devel::LexAlias } ? IMPLEMENTATION_DEVEL_LEXALIAS :
- eval { require PadWalker } ? IMPLEMENTATION_PADWALKER :
- IMPLEMENTATION_TIE;
- };
+ $implementation ||= _pick_alternative(
+ if => ( $] ge '5.022' ) => IMPLEMENTATION_NATIVE,
+ needs => 'Devel::LexAlias' => IMPLEMENTATION_DEVEL_LEXALIAS,
+ needs => 'PadWalker' => IMPLEMENTATION_PADWALKER,
+ if => !!1 => IMPLEMENTATION_TIE,
+ );
}
#>>>
@@ -77,10 +93,11 @@ sub import {
my $subname;
my %already; # prevent renaming established functions
sub set_subname ($$) {
- defined $subname or $subname =
- eval { require Sub::Util } ? \&Sub::Util::set_subname :
- eval { require Sub::Name } ? \&Sub::Name::subname :
- 0;
+ $subname = _pick_alternative(
+ needs => 'Sub::Util' => sub { \&Sub::Util::set_subname },
+ needs => 'Sub::Name' => sub { \&Sub::Name::subname },
+ if => !!1 => 0,
+ ) unless defined $subname;
$subname and !$already{$_[1]}++ and return &$subname;
$_[1];
} #/ sub set_subname ($$)