+ prototype. It croaks if the arguments can't possibly match the required
+ prototype, e.g. when a reference type is wrong or when not enough
+ elements were provided.
+
+ "wrap $name, %opts"
+ Generates a wrapper that calls the function $name with a prototyped
+ argument list. That is, the wrapper's arguments should be what @_ is
+ when you define a subroutine with the same prototype as $name.
+
+ my $a = [ 0 .. 2 ];
+ my $push = wrap 'CORE::push';
+ $push->($a, 3, 4); # returns 3 + 2 = 5 and $a now contains 0 .. 4
+
+ You can force the use of a specific prototype. In this case, $name must
+ be a hash reference that holds exactly one key / value pair, the key
+ being the function name and the value the prototpye that should be used
+ to call it.
+
+ my $push = wrap { 'CORE::push' => '\@$' }; # only pushes 1 arg
+
+ Others arguments are seen as key / value pairs that are meant to tune
+ the code generated by "wrap". Valid keys are :
+
+ "ref => $func"
+ Specifies the function used in the generated code to test the
+ reference type of scalars. Defaults to 'ref'. You may also want to
+ use "reftype" in Scalar::Util.
+
+ "wrong_ref => $code"
+ The code executed when a reference of incorrect type is encountered.
+ The result of this snippet is also the result of the generated code,
+ hence it defaults to 'undef'. It's a good place to "croak" or "die"
+ too.
+
+ "sub => $bool"
+ Encloses the code into a "sub { }" block. Default is true.
+
+ "compile => $bool"
+ Makes "wrap" compile the code generated and return the resulting
+ code reference. Be careful that in this case "ref" must be a fully
+ qualified function name. Defaults to true, but turned off when "sub"
+ is false.
+
+ For example, this allows you to recall into "CORE::grep" and "CORE::map"
+ by using the "\&@" prototype :
+
+ my $grep = wrap { 'CORE::grep' => '\&@' };
+ sub mygrep (&@) { $grep->(@_) } # the prototypes are intentionally different