| 
<?phpnamespace eMacros\Runtime\Comparison;
 
 use eMacros\Runtime\GenericFunction;
 
 abstract class ComparisonPredicate extends GenericFunction {
 protected $logicalOr = false;
 
 /**
 * Compares various operands
 * Usage: (== 1 2) (>= 4 3) (=== "1" 1)
 * Returns: boolean
 * (non-PHPdoc)
 * @see \eMacros\Runtime\GenericFunction::execute()
 */
 public function execute(array $operands) {
 if (empty($operands)) {
 throw new \BadFunctionCallException(sprintf("%s: No objects to compare.", get_class($this)));
 }
 
 if (!isset($operands[1])) {
 throw new \BadFunctionCallException(sprintf("%s: Cannot compare single object.", get_class($this)));
 }
 
 $fst = array_shift($operands);
 $or = $this->logicalOr;
 
 foreach ($operands as $val) {
 if ($or xor !$this->compare($fst, $val)) {
 return $or;
 }
 
 $fst = $val;
 }
 
 return !$or;
 }
 
 abstract protected function compare($a, $b);
 }
 ?>
 |