/** * Add method to definition * * @param array|Rest_Method_Definition $method * @param null|string $name * @return Rest_Definition * @throws Rest_Exception if duplicate or invalid method provided */ public function addMethod($method, $name = null) { if (is_array($method)) { require_once 'classes/rest/method/Definition.php'; $method = new Rest_Method_Definition($method); } elseif (!$method instanceof Rest_Method_Definition) { require_once 'Exception.php'; throw new Rest_Exception('Invalid method provided'); } if (is_numeric($name)) { $name = null; } if (null !== $name) { $method->setName($name); } else { $name = $method->getName(); } if (null === $name) { require_once 'Exception.php'; throw new Rest_Exception('No method name provided'); } if (!$this->_overwriteExistingMethods && array_key_exists($name, $this->_methods)) { require_once 'Exception.php'; throw new Rest_Exception(sprintf('Method by name of "%s" already exists', $name)); } $this->_methods[$name] = $method; return $this; }
/** * Build a method signature * * @param Rest_Reflection_Function_Abstract $reflection * @param null|string|object $class * @return Rest_Method_Definition * @throws Rest_Exception on duplicate entry */ protected function _buildSignature(Rest_Reflection_Function_Abstract $reflection, $class = null) { $ns = $reflection->getNamespace(); $name = $reflection->getName(); $method = empty($ns) ? $name : $ns . '.' . $name; if (!$this->_overwriteExistingMethods && $this->_table->hasMethod($method)) { require_once 'Exception.php'; throw new Rest_Exception('Duplicate method registered: ' . $method); } $definition = new Rest_Method_Definition(); $definition->setName($method)->setCallback($this->_buildCallback($reflection))->setMethodHelp($reflection->getDescription())->setInvokeArguments($reflection->getInvokeArguments()); foreach ($reflection->getPrototypes() as $proto) { $prototype = new Rest_Method_Prototype(); $prototype->setReturnType($this->_fixType($proto->getReturnType())); foreach ($proto->getParameters() as $parameter) { $param = new Rest_Method_Parameter(array('type' => $this->_fixType($parameter->getType()), 'name' => $parameter->getName(), 'optional' => $parameter->isOptional())); if ($parameter->isDefaultValueAvailable()) { $param->setDefaultValue($parameter->getDefaultValue()); } $prototype->addParameter($param); } $definition->addPrototype($prototype); } if (is_object($class)) { $definition->setObject($class); } $this->_table->addMethod($definition); return $definition; }