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:----EzHxR/uEMCfmQ7YrJMNWPwRdbOySfAk1ojaCE7xe5ciT/ClRuYGFwnFGrYiuDsjy46CgRpY9bNp4xD9Pw4+GaWan9LnSSJu7jJjubq/W9oJyVXNVtjcR2Zikq5nLyhFCpciW2IMoWP1S70PiXhVq4hPqF+JhAxVyWnQbTSqaB5jcKuJA+KbNSS3TLCZezFXWwbxQ9C4vt7XdtyIqVPdTOAv7mU7gnLf7YOM5wIqdn3Ad7pLz+r44auEQ2YOFl4HxlYXfvD3gzVYujAym2+bVZpq9tCD/06SyzibgLvFsXbb3cCvZhdmSKgKNXI2T2OT/1O4qjJF8bTlyuRTh2xcl8u164qYDfn+mDe9RkiRNkbRRjfB2smYD7dwONrL2zHocweDDKrTsDBFhQKdj2zEoVzWqUmMdTTSuIc/+XcLOETvYkhgAFBOHm3bUUaHd7FIR7ZuvqeFZCUE8oEp6gcxKmoaZ40/r+GzOEM5uHFdZg1lKzowqgHreP6tNqqu8fZE8jdGaY2JsjJXUUvDA+vbyWfWWqpzyxNe1yPVjtXg8Z7JM6ilij2tOMae/iYux/zrD2Oc8xGnPs2xtliRzQ7L04mzVZuOomldnFC9+LrVRZRtHTxoivTVYQ/ckZY4771EmDH8feIeM4IAYm2R48AjdnkzH8zHa7mOE0QkDGX/NaEk=----ATTACHMENT:----OTU1NDk0MzQyMjgzNjA4OCA0MDU5Mzc5Mzg3NzY4NDEyIDE1NDUwNDI1Mjk2MTMzNTM=