/**
* does the actual collection of data about available services
* @return array of AmfphpDiscovery_ServiceInfo
*/
public function discover()
{
$availableServiceNames = $this->getAvailableServiceNames(self::$serviceFolderPaths, self::$serviceNames2ClassFindInfo);
$ret = array();
foreach ($availableServiceNames as $availableServiceName) {
$serviceObject = Amfphp_Core_Common_ServiceRouter::getServiceObjectStatically($availableServiceName, self::$serviceFolderPaths, self::$serviceNames2ClassFindInfo);
$reflectionObj = new ReflectionObject($serviceObject);
$availablePublicMethods = $reflectionObj->getMethods(ReflectionMethod::IS_PUBLIC);
$methods = array();
foreach ($availablePublicMethods as $methodDescriptor) {
$availableMethodName = $methodDescriptor->name;
if (substr($availableMethodName, 0, 1) == '_') {
//methods starting with a '_' as they are reserved, so filter them out
continue;
}
$parameters = array();
$method = $reflectionObj->getMethod($availableMethodName);
$parameterDescriptors = $method->getParameters();
foreach ($parameterDescriptors as $parameterDescriptor) {
$availableParameterName = $parameterDescriptor->name;
$type = '';
if ($parameterDescriptor->getClass()) {
$type = $parameterDescriptor->getClass()->name;
}
$parameterInfo = new AmfphpDiscovery_ParameterDescriptor($availableParameterName, $type);
$parameters[] = $parameterInfo;
}
$methodInfo = new AmfphpDiscovery_MethodDescriptor($availableMethodName, $parameters);
$methods[$availableMethodName] = $methodInfo;
}
$serviceInfo = new AmfphpDiscovery_ServiceDescriptor($availableServiceName, $methods);
$ret[$availableServiceName] = $serviceInfo;
}
//note : filtering must be done at the end, as for example excluding a Vo class needed by another creates issues
foreach ($ret as $serviceName => $serviceObj) {
foreach (self::$excludePaths as $excludePath) {
if (strpos($serviceName, $excludePath) !== false) {
unset($ret[$serviceName]);
break;
}
}
}
return $ret;
}