rendered paste body<?phpclass Validator { protected $_errors; protected $_fields; protected $_validators; public function __construct($extenders = null) { $this->_errors = null; $this->_fields = Array(); if($extenders !== null) { if(is_array($extenders)) foreach($extenders as $extender) $this->extend($extender); else $this->extend($extenders); }; } protected function addField($name, $method, $args) { $method = $this->getMethod($method); if($method) $this->_fields[] = compact('name', 'method', 'args'); else throw new Exception('Cannot find ' . $name . ' validation method'); } public function getErrors() { return $this->_errors; } public function validate($data) { $result = true; $this->_errors = Array(); $isObject = is_object($data); if(!is_array($data) && !is_object($data)) throw new Exception('Provided data type isn\'t array or object'); foreach($this->_fields as $field) { extract($field); extract($method); $value = $data[$isObject ? $data->$key : $data[$key], $field->args; $result = $result && ($reflection->invokeArgs($instance, Array($value, $args)); } return $result; } protected function extend($extender) { $reflection = new ReflectionClass($extender); $object = $reflection->newInstance($this); $this->_extenders[] = compact('reflection', 'instance'); } protected function getExtender($name) { if(!isset($this->_extenders[$name])) $this->extend($name); return $this->_extenders[$name]; } protected function getMethod($name) { $method = null; $pos = strpos($name, '.'); if($pos !== false) { $extender = $this->getExtender(substr($name, 0, $pos)); if($extender) { $reflection = $extender['reflection']; if($reflection->hasMethod($name)) $method = $reflection->getMethod($name); } } else { reset($this->_extenders); while($extender = next($this->_extenders) || $method) { $reflection = $extender['reflection']; if($reflection->hasMethod($name)) $method = $reflection->getMethod($name); } } return $method ? Array('reflection' => $method, 'instance' => $extender['instance') : NULL; } protected function callValidator($name, $value, $args) $method = $this->getMethod($name); if(!$method) throw new Exception('Cannot find ' . $name . ' validation method'); return $method['reflection']->invokeArgs($method['instance'], Array($value, $args)); }}?>