/** * Build a method signature * * @param Reflection\AbstractFunction $reflection * @param null|string|object $class * @return Method\Definition * @throws Exception\RuntimeException on duplicate entry */ protected function _buildSignature(Reflection\AbstractFunction $reflection, $class = null) { $ns = $reflection->getNamespace(); $name = $reflection->getName(); $method = empty($ns) ? $name : $ns . '.' . $name; if (!$this->overwriteExistingMethods && $this->table->hasMethod($method)) { throw new Exception\RuntimeException('Duplicate method registered: ' . $method); } $definition = new Method\Definition(); $definition->setName($method)->setCallback($this->_buildCallback($reflection))->setMethodHelp($reflection->getDescription())->setInvokeArguments($reflection->getInvokeArguments()); foreach ($reflection->getPrototypes() as $proto) { $prototype = new Method\Prototype(); $prototype->setReturnType($this->_fixType($proto->getReturnType())); foreach ($proto->getParameters() as $parameter) { $param = new 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; }