private static function prepareForSerize(\ReflectionAnnotatedClass $reflection, $object, $parent = false) { $hash = spl_object_hash($object); if (in_array($hash, self::$prepared) && $parent == false) { return; } array_push(self::$prepared, $hash); $globalAltered = false; $defaults = null; foreach ($reflection->getProperties() as $property) { $altered = false; $property->setAccessible(true); $value = $property->getValue($object); if (self::isTransient($property)) { $defaults = $defaults == null ? $reflection->getDefaultProperties() : $defaults; $name = $property->getName(); $property->setValue($object, array_key_exists($name, $defaults) ? $defaults[$name] : null); $altered = true; } else { if (is_object($value) && $value instanceof \Closure) { $property->setValue($object, new SerializableClosure($value)); $altered = true; } else { if (is_object($value) && !$value instanceof SerializableClosure && spl_object_hash($value) != $hash) { $valueReflection = new \ReflectionAnnotatedClass($value); $altered = self::prepareForSerize($valueReflection, $value); } else { if (is_array($value)) { $newValue = self::prepareArrayForSerialize($value); if (is_array($newValue)) { $property->setValue($object, $newValue); $altered = true; } } } } } if ($altered) { self::addRestore($property, $object, $value); $globalAltered = true; } } $parent = $reflection->getParentClass(); if ($parent != null) { self::prepareForSerize($parent, $object, true); } if (!$parent) { if ($object instanceof Detachable) { $object->detach(); } } return $globalAltered; }