+=head2 C<recall>
+
+ my @res = recall($name, @args);
+ my @res = recall({ $name => $proto }, @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;
+
+BEGIN {
+ my $safe_wrap = sub {
+ my $name = shift;
+
+ my ($wrap, $err);
+ {
+ local $@;
+ $wrap = eval { wrap $name };
+ $err = $@;
+ }
+
+ $wrap, $err;
+ };
+
+ if ("$]" == 5.008) {
+ # goto tends to crash a lot on perl 5.8.0
+ *recall = sub {
+ my ($wrap, $err) = $safe_wrap->(shift);
+ croak _clean_msg $err if $err;
+ $wrap->(@_)
+ }
+ } else {
+ *recall = sub {
+ my ($wrap, $err) = $safe_wrap->(shift);
+ croak _clean_msg $err if $err;
+ goto $wrap;
+ }
+ }
+}
+