NAME

ContractClosure - An alternative implementation av Sub::Contract, using closures instead of dynamic compilation

SYNOPSIS

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;
   }