diff options
author | Toby Inkster <mail@tobyinkster.co.uk> | 2022-09-12 19:34:37 +0100 |
---|---|---|
committer | Toby Inkster <mail@tobyinkster.co.uk> | 2022-09-12 19:34:37 +0100 |
commit | 142c6a70a14d371cc919c8ce70390196a858c574 (patch) | |
tree | d32dde992617a59996bd9fb7289c8ddd510cc5e3 /lib | |
parent | 53a24b1a91535735ba98ec646c4fb508d42f0a53 (diff) |
More readable way to pick an implementation
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Eval/TypeTiny.pm | 37 |
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 ($$) |