Scalr\Service\Aws\AbstractDataType::_setExternalIdentifiersRecursively PHP Method

_setExternalIdentifiersRecursively() private method

Sets external identifiers recursively
private _setExternalIdentifiersRecursively ( object &$holder, object &$inner )
$holder object
$inner object
    private function _setExternalIdentifiersRecursively(&$holder, &$inner)
    {
        if ($inner !== null) {
            if ($inner instanceof ListDataType) {
                $dataSet = array_merge(array($inner), $inner->getOriginal());
            } else {
                $dataSet = array($inner);
            }
            //Property inheritance pattern
            foreach ($dataSet as $object) {
                if (is_object($object) && method_exists($object, 'getExternalIdentifiers')) {
                    $hash = spl_object_hash($object);
                    //Prevents from endless loops.
                    if (isset($this->known[$hash])) {
                        return;
                    }
                    $this->known[$hash] = true;
                    //Distributes Service interface instances
                    if ($object instanceof AbstractServiceRelatedType && !$object->_getServiceRelatedDatasetUpdated()) {
                        $ins = $object->getServiceNames();
                        if (!empty($ins)) {
                            $ths = $this->getServiceNames();
                            if ($holder instanceof AbstractServiceRelatedType) {
                                $hs = $holder->getServiceNames();
                            } else {
                                $hs = array();
                            }
                            if (!empty($ths) || !empty($hs)) {
                                $cnt = 0;
                                foreach ($ins as $sn) {
                                    $fgetsn = 'get' . ucfirst($sn);
                                    $fsetsn = 'set' . ucfirst($sn);
                                    if (in_array($sn, $ths) && $this->{$fgetsn}() !== null) {
                                        $object->{$fsetsn}($this->{$fgetsn}());
                                        $cnt++;
                                    } else {
                                        if (in_array($sn, $hs) && $holder->{$fgetsn}() !== null) {
                                            $object->{$fsetsn}($holder->{$fgetsn}());
                                            $cnt++;
                                        }
                                    }
                                }
                                if ($cnt == count($ins)) {
                                    $object->_setServiceRelatedDatasetUpdated(true);
                                }
                            }
                            unset($ths);
                            unset($hs);
                        }
                        unset($ins);
                    }
                    if (!$object->_getExternalKeysUpdated()) {
                        $externalIds = $object->getExternalIdentifiers();
                        $cnt = 0;
                        foreach ($externalIds as $key) {
                            $property = ucfirst($key);
                            $setProperty = 'set' . $property;
                            $getProperty = 'get' . $property;
                            if (property_exists($holder, $key) && $holder->{$key} !== null) {
                                $object->{$setProperty}($holder->{$key});
                                $cnt++;
                            } else {
                                if ((in_array($key, $holder->getPropertiesForInheritance()) || in_array($key, $holder->getExternalIdentifiers())) && $holder->{$getProperty}() !== null) {
                                    $object->{$setProperty}($holder->{$getProperty}());
                                    $cnt++;
                                }
                            }
                        }
                        if ($cnt == count($externalIds)) {
                            $object->_setExternalKeysUpdated(true);
                        }
                    }
                    if ($object instanceof AbstractDataType) {
                        $props = $object->getPropertiesForInheritance();
                        foreach ($props as $p) {
                            $getProperty = 'get' . $p;
                            $sub = $object->{$getProperty}();
                            if ($sub instanceof AbstractDataType) {
                                if (!$sub->_hasInheritedDataSet()) {
                                    $this->_setExternalIdentifiersRecursively($object, $sub);
                                }
                            }
                            unset($sub);
                        }
                    }
                }
            }
        }
    }