_criteria = &$criteria; } function &getCriteria() { return $this->_criteria; } } class FAFailedCriteriaObserver extends FAObserver { var $_errors = array(); function getErrors() { return $this->_errors; } function isValid() { return empty($this->_errors); } function notify(&$event) { $this->_errors[] = &$event; } } class FAValidator extends FAObserver { var $_criteria = array(); var $_dispatcher; function FAValidator() { $this->_dispatcher = &new FADispatcher; $this->addObserver($this); } function addCriteria(&$criteria) { assert(is_a($criteria, 'FACriteria')); $this->_criteria[] = &$criteria; } function addObserver(&$observer) { $this->_dispatcher->addObserver($observer); } function notify(&$event) { } //TODO:{[$table is a bad name, change it![run[FAValidator} function run(&$table) { $it = &new FAArrayIterator($this->_criteria); while ($it->next()) { $criteria = &$it->current(); if ($criteria->validate($table, $this->_dispatcher)) break; } } } ?>