]> git.vpit.fr Git - perl/modules/Sub-Prototype-Util.git/commitdiff
Clean up _wrap()
authorVincent Pit <vince@profvince.com>
Thu, 25 Aug 2011 09:20:29 +0000 (11:20 +0200)
committerVincent Pit <vince@profvince.com>
Thu, 25 Aug 2011 09:20:29 +0000 (11:20 +0200)
lib/Sub/Prototype/Util.pm

index d52b905f8c8370fad0e2b7f218952da99b52e30f..d2564d85e33dd66c758302d3798343d97b999367 100644 (file)
@@ -158,47 +158,52 @@ For example, this allows you to recall into C<CORE::grep> and C<CORE::map> by us
 =cut
 
 sub _wrap {
- my ($name, $proto, $i, $args, $cr, $opts) = @_;
+ my ($name, $proto, $i, $args, $coderefs, $opts) = @_;
+
  while ($proto =~ s/(\\?)(\[[^\]]+\]|[^\];])//) {
-  my ($ref, $p) = ($1, $2);
-  $p = $1 if $p =~ /^\[([^\]]+)\]/;
-  my $cur = '$_[' . $i . ']';
+  my ($ref, $sigil) = ($1, $2);
+  $sigil = $1 if $sigil =~ /^\[([^\]]+)\]/;
+
+  my $cur = "\$_[$i]";
+
   if ($ref) {
-   if (length $p > 1) {
-    return 'my $r = ' . $opts->{ref} . '(' . $cur . '); '
-           . join ' els',
-              map( {
-               "if (\$r eq '" . $reftypes{$_} ."') { "
-               . _wrap($name, $proto, ($i + 1),
-                              $args . $_ . '{' . $cur . '}, ',
-                              $cr, $opts)
-               . ' }'
-              } split //, $p),
-              'e { ' . $opts->{wrong_ref} . ' }'
+   if (length $sigil > 1) {
+    my $code     = "my \$r = $opts->{ref}($cur); ";
+    my @branches = map {
+     my $subcall = _wrap(
+      $name, $proto, ($i + 1), $args . "$_\{$cur}, ", $coderefs, $opts
+     );
+     "if (\$r eq '$reftypes{$_}') { $subcall }";
+    } split //, $sigil;
+    $code .= join ' els', @branches, "e { $opts->{wrong_ref} }";
+    return $code;
    } else {
-    $args .= $p . '{' . $cur . '}, ';
+    $args .= "$sigil\{$cur}, ";
    }
-  } elsif ($p =~ /[\@\%]/) {
+  } elsif ($sigil =~ /[\@\%]/) {
    $args .= '@_[' . $i . '..$#_]';
-  } elsif ($p =~ /\&/) {
-   my %h = do { my $c; map { $_ => $c++ } @$cr };
+  } elsif ($sigil =~ /\&/) {
+   my %h = do { my $c; map { $_ => $c++ } @$coderefs };
    my $j;
-   if (not exists $h{$i}) {
-    push @$cr, $i;
-    $j = $#{$cr};
-   } else {
+   if (exists $h{$i}) {
     $j = int $h{$i};
+   } else {
+    push @$coderefs, $i;
+    $j = $#{$coderefs};
    }
-   $args .= 'sub{&{$c[' . $j . ']}}, ';
-  } elsif ($p eq '_') {
-   $args .= '((@_ > ' . $i . ') ? ' . $cur . ' : $_), ';
+   $args .= "sub{&{\$c[$j]}}, ";
+  } elsif ($sigil eq '_') {
+   $args .= "((\@_ > $i) ? $cur : \$_), ";
   } else {
-   $args .= $cur . ', ';
+   $args .= "$cur, ";
   }
+ } continue {
   ++$i;
  }
+
  $args =~ s/,\s*$//;
- return $name . '(' . $args . ')';
+
+ return "$name($args)";
 }
 
 sub _check_name {