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:----li9TB9s/GhaqczF/7IA0vKxyU9/urX7bx6OY1A1SrUTHTzfDhE0LH5Ez1RTIAj+GLY9trVY9zvEh7c+9ZgMxRWjrw7/AL5kugu7ZoLgXC2Ttz2WuuAanwXQJBMp7Zx+V+aycLU3rQku2HkrDzrfGdbC4PYX89Fj23QPhV53lWFaYg4vnEz4v+NwKtkQ+1PIjizI0iiypOWa0jr1UUx+xMEVk8TkgHoCK1QSTEUeJuxwFgvkxCKrgUSDwnq5ugHhgNUt5cPf9lKS7VaC2Fd870fJ2a8ry7EAy1NajwNWKSJGP4vs4N+K+HQWwoc2BI/I4Le6yOnpgQsZfrrdsxvLFHo7Ac+PG2FhPeJkrOqJDJOr8VimFK2IE1tDlh75mYQamZlHhi+SaVGuXKCYDZ9YkC04X54ljH8W9pW6GDMgJ+rcR92VZFoZu2T+h25TlGRBkSwuFJVvN2TPsTQoy2zOrqMg0ggP/57Z3mLUth7pbfLTI8UrLMaJJ8QYVe6zNaeTlptYYiwnQD08MUy79e/4pveeVwVKbFgCWNc6PtITaD2/OxIs5hV0ggcNSLX0Ys22m0bVuTopgivOeWZX/6K2CJ7/InQRDBaCC3h2XZcyTB3yKFe/1lP424GOWez1X0PYZEmIvzjvamq/jhah2wTap0HoAX1+0g7wwm9L3ux1S6yA=----ATTACHMENT:----NTY0NDE5MTkzMzg4NTgzNyA0NTMzNTk3NzY5NTM1ODcwIDcyMjc2NjUyNTIxMDk5OTA=