ContractClosure - An alternative implementation av Sub::Contract, using closures instead of dynamic compilation
to control arguments passed in array style, and cache the results:
use ContractClosure; contract('foo', in => { # define constraints on input arguments count => 3, # there must be exactly 3 input arguments defined => 1, # they must all be defined check => [ undef, # no constraint on first argument \&is_integer, # argument ok if is_integer(<arg>) returns true sub { return (ref $_[0] eq ""); }, # ok if argument is a scalar ], }, out => { # define constraints on output arguments count => 2, }, cache => { size => 10000 }, ); sub foo { my($a,$b,$c) = @_; return (1,undef); }
and to control arguments passed in hash style:
contract('foo', in => { count => 4, # must be 4 input arguments # do not need to be all defined ('defined => 0' is the default) check => { bib => \&is_year, # if key 'bib' exists, its value must pass is_year() bob => \&is_shortdate, # if key 'bob' exists, its value must pass is_shortdate() bub => undef, # no constraint on bub except that this key must exist (but can be 'undef') }, optional => ['bib'] # allow key 'bib' to be non existing (but if it exists, it must pass 'is_year') }, out => { count => 1, defined => 1, }, ); sub foo { my(%hash) = @_; print "arg1: ".$hash{bib}; print "arg2: ".$hash{bob}; return $b; }
To install Sub::Contract, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Sub::Contract
CPAN shell
perl -MCPAN -e shell install Sub::Contract
For more information on module installation, please visit the detailed CPAN module installation guide.