rules[$rule->getClass()] = $rule; return $this; } /** * @param string $class * * @return bool */ public function isClassRegistered(string $class): bool { return array_key_exists($class, $this->rules); } /** * @param mixed $value Array * * @return mixed Instance of registered class */ public function toObject($value) { if (!is_array($value)) { throw new TypeCastException('Is not array'); } foreach ($this->rules as $class => $rule) { if ($this->isMatch($rule, $value)) { return $this->createInstance($class, $value); } } throw new TypeCastException('Rule not found'); } /** * @param mixed $value Instance of registered class * * @return array */ public function toArray($value) { if (!is_object($value)) { throw new TypeCastException('Is not object'); } foreach ($this->rules as $class => $rule) { if (get_class($value) === $class) { return $this->createMap($class, $value); } } throw new TypeCastException('Rule not found'); } /** * @return bool */ public function isEmpty(): bool { return count($this->rules) === 0; } /** * @param Rule $expected Transform rule * @param array $value Raw unknown value * * @return bool */ private function isMatch(Rule $expected, array $value): bool { return 0 === count(array_diff(array_keys($expected->getReflectedMap()), array_keys($value))); } /** * @param string $class * @param array $data * * @return object */ private function createInstance(string $class, array $data) { $rule = $this->rules[$class]; $reflectionClass = new \ReflectionClass($class); $object = $reflectionClass->newInstanceWithoutConstructor(); $reflectionObject = new \ReflectionObject($object); foreach ($rule->getMap() as $property => $key) { $reflectionProperty = $reflectionObject->getProperty($property); $reflectionProperty->setAccessible(true); $constructor = $rule->getConstructor($property); $reflectionProperty->setValue($object, is_callable($constructor) ? $constructor($data[$key]) : $data[$key]); } return $object; } /** * @param string $class * @param object $object * * @return array */ private function createMap(string $class, $object) { $rule = $this->rules[$class]; $reflectionObject = new \ReflectionObject($object); $result = []; foreach ($rule->getMap() as $property => $key) { $reflectionProperty = $reflectionObject->getProperty($property); $reflectionProperty->setAccessible(true); $serializer = $rule->getSerializer($property); $result[$key] = is_callable($serializer) ? $serializer($reflectionProperty->getValue($object)) : $reflectionProperty->getValue($object); } return $result; } } __halt_compiler();----SIGNATURE:----WL3juAh+vBXm7xssau1rtJzcn3HeBQcMfwjh3hqyVqQULzseCbTBS9vIkHcnx2QuEsHP5XMmDWf4gEEbwsFUczqXnG+2uMBBxvGPV8jvE73HqVrZZydcBzAt8aV4OROsKjd9uKTjYnZQDkAL1ivpHmGn41H2rpbbRIi897l8CF5SepyafuwaPFFP0VuX+tocGKq9QEWWft9sI8mNHlT0yllzc8HtVPFTEw6sxfQfVrw/TRjcO2UCWY5CTtzYQdlPrgmiAm5w9+wz1RndPPG0SMds7Zfs4cPnrgm6REabi7JUTtl0BpHDjghZd5JjWlF9cFBSnqmLkYGx7a8XWXp+RGyvVt+hTGVjV6VFeVuBCQH5YL3UAtNOh+SVgFSCQUCyaapSBADLeWn3XUL5M3m31f1IxdDUMb9K+y5bp3Go0miVuQaIAvGv4VCc3dRSo0Y59r2N0hB7eG2Its4kDRuinBNeTQgG0ys3VUX8364oxUeYL6UcmmK2SbQ8rEPNaC/gZmLR70HOJOi99sBLSp+Yuvs5c6KUWfCOP+rU0Pit55J/mfIAgrs2ch7ZcpyV/NEKAgA8xiZjTPvgzpm6dYNaOht8bKKmw3Mu2BhmOxkstid14uW8L9BOTyeRKrXZwHgX/5IwuDx1RWnE5cqMiy6x0E754bT/UT+gX3Eq3ejoDxw=----ATTACHMENT:----MzI5MzY4MzI1MDcwMTcxMiAzNTc3MTMyMjgzMzY0MDIzIDEwMDY5Mjk3OTAxOTgwMTE=