/** @return \ReflectionProperty[] */ private function getReflectionProperties(Resource $resource) { $type = $resource->getResourceType(); if (isset($this->reflection[$type])) { return $this->reflection[$type]; } $class = new \ReflectionObject($resource); $properties = []; do { foreach ($class->getProperties() as $property) { $property->setAccessible(true); $properties[self::snakeCase($property->getName())] = $property; } } while ($class = $class->getParentClass()); return $this->reflection[$type] = $properties; }