After a spate of literal coding nightmares, I woke needing to commit these
thoughts to the list. These may have been raised before, I can't remember,
these debate has been raging for so long.
THING 1: Hints are just is_* wrappers
function f(scalar $s, int $i) { }
effectively is sugar for:
function f($s, $i) {
if (! is_scalar($s)) throw new \InvalidArgumentException();
if (! is_int($i)) throw new \InvalidArgumentException();
}
THING 2: Hints are truthy callables
function my_mixed($m) {
return (null === $m || is_string($m));
}
function f(is_scalar $s, is_int $i, my_mixed $m) {};
THING 3: Pre- and post- blocks to define contracts, establish formal join
points, with or without hints from above
function f($s, $i, $m)
before {
if (! is_scalar($s)) throw new \InvalidArgumentException;
},
inside {
$fp = fopen($s, 'r');
return [ $i, $m ];
},
after ($retval) {
assert(is_array($retval) && 2 === count($retval));
},
finally ($retval) {
fclose($fp);
if ($retval instanceof \Exception) {
// I got here by an unhandled exception
}
}
weave('before', 'f', function ($s, $i, $m) {
syslog(LOG_DEBUG, __POINTCUT__); // is 'f'
}
I had to get these off my chest. Forgive me their implementation ignorance.
I am yet tired and uncaffeinated. To the void I commit their bodies...
bishop