Sub::Prototype::Util - Prototype-related utility routines.
VERSION
- Version 0.10
+ Version 0.11
SYNOPSIS
use Sub::Prototype::Util qw<flatten wrap recall>;
my @a = qw<a b c>;
my @args = ( \@a, 1, { d => 2 }, undef, 3 );
- my @flat = flatten '\@$;$', @args; # ('a', 'b', 'c', 1, { d => 2 })
- recall 'CORE::push', @args; # @a contains 'a', 'b', 'c', 1, { d => 2 }, undef, 3
+ my @flat = flatten '\@$;$', @args;
+ # @flat contains now ('a', 'b', 'c', 1, { d => 2 })
+
+ my $res = recall 'CORE::push', @args;
+ # @a contains now 'a', 'b', 'c', 1, { d => 2 }, undef, 3
+ # and $res is 7
+
my $splice = wrap 'CORE::splice';
- my @b = $splice->(\@a, 4, 2); # @a is now ('a', 'b', 'c', 1, 3) and @b is ({ d => 2 }, undef)
+ my @b = $splice->(\@a, 4, 2);
+ # @a contains now ('a', 'b', 'c', 1, 3)
+ # and @b is ({ d => 2 }, undef)
DESCRIPTION
Prototypes are evil, but sometimes you just have to bear with them,
They all handle 5.10's "_" prototype.
FUNCTIONS
- "flatten $proto, @args"
+ "flatten"
+ my @flattened = flatten($proto, @args);
+
Flattens the array @args according to the prototype $proto. When @args
is what @_ is after calling a subroutine with prototype $proto,
"flatten" returns the list of what @_ would have been if there were no
prototype, e.g. when a reference type is wrong or when not enough
elements were provided.
- "wrap $name, %opts"
+ "wrap"
+ my $wrapper = wrap($name, %opts);
+ my $wrapper = wrap({ $name => $proto }, %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 $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 :
+ The remaining arguments %opts are treated as key / value pairs that are
+ meant to tune the code generated by "wrap". Valid keys are :
+
+ * "ref => $func"
- "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"
+ * "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"
+ * "sub => $bool"
+
Encloses the code into a "sub { }" block. Default is true.
- "compile => $bool"
+ * "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"
by using the "\&@" prototype :
my $grep = wrap { 'CORE::grep' => '\&@' };
- sub mygrep (&@) { $grep->(@_) } # the prototypes are intentionally different
+ # the prototypes are intentionally different
+ sub mygrep (&@) { $grep->(@_) }
+
+ "recall"
+ my @res = recall($name, @args);
+ my @res = recall({ $name => $proto }, @args);
- "recall $name, @args"
Calls the function $name with the prototyped argument list @args. That
is, @args should be what @_ is when you call a subroutine with $name as
prototype. You can still force the prototype by passing "{ $name =>
<http://www.profvince.com/perl/cover/Sub-Prototype-Util>.
COPYRIGHT & LICENSE
- Copyright 2008,2009,2010,2011 Vincent Pit, all rights reserved.
+ Copyright 2008,2009,2010,2011,2013 Vincent Pit, all rights reserved.
This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.