private function toNodeModelExtra($response, $exclude = null)
{
$extra = array();
$rc = new \ReflectionClass($response);
$public_props = array_map(function ($x) {
return $x->name;
}, $rc->getProperties(\ReflectionProperty::IS_PUBLIC));
# desired properties are copied into the returned array
$desired_properties = $public_props;
if (is_array($exclude)) {
$desired_properties = array_diff($public_props, $exclude);
}
# convert fields known to contain (possibly nested) stdClass objects
$obj_properies = array_intersect(array('links', 'addresses', 'image', 'flavor'), $desired_properties);
foreach ($obj_properies as $prop) {
if (is_array($response->{$prop})) {
$extra[$prop] = array();
foreach ($response->{$prop} as $k => $obj) {
$extra[$prop][$k] = $this->getObjectVarsRecursively($obj);
}
} else {
$extra[$prop] = $this->getObjectVarsRecursively($response->{$prop});
}
unset($desired_properties[array_search($prop, $desired_properties)]);
}
# convert metadata
if (in_array('metadata', $desired_properties)) {
if ($response->metadata instanceof OpenCloudMetadata) {
$extra['metadata'] = $response->metadata->toArray();
}
unset($desired_properties[array_search('metadata', $desired_properties)]);
}
# get the rest of the desired properties
foreach ($desired_properties as $propName) {
$extra[$propName] = $response->{$propName};
}
return $extra;
}