+ if (@cr) {
+ $call = 'my @c; '
+ . join('', map { 'push @c, $_[' . $_ . ']; ' } @cr)
+ . $call
+ }
+ $call = '{ ' . $call . ' }';
+ $call = 'sub ' . $call if $opts{sub};
+ if ($opts{compile}) {
+ $call = eval $call;
+ croak _clean_msg $@ if $@;
+ }
+ return $call;
+}
+
+=head2 C<recall $name, @args>
+
+Calls the function C<$name> with the prototyped argument list C<@args>.
+That is, C<@args> should be what C<@_> is when you call a subroutine with C<$name> as prototype.
+You can still force the prototype by passing C<< { $name => $proto } >> as the first argument.
+
+ my $a = [ ];
+ recall { 'CORE::push' => '\@$' }, $a, 1, 2, 3; # $a just contains 1
+
+It's implemented in terms of L</wrap>, and hence calls C<eval> at each run.
+If you plan to recall several times, consider using L</wrap> instead.
+
+=cut
+
+sub recall {
+ my $wrap = eval { wrap shift };
+ croak _clean_msg $@ if $@;
+ return $wrap->(@_);