protected static function getClassProperties(string $className) : array
    {
        if (empty(static::$classProperties[$className])) {
            $ref = new ReflectionClass($className);
            $properties = [];
            foreach ($ref->getProperties() as $prop) {
                $f = $prop->getName();
                $properties[$f] = $prop;
            }

            if ($parentClass = $ref->getParentClass()) {
                $parentPropsArr = static::getClassProperties($parentClass->getName());
                if (\count($parentPropsArr) > 0) {
                    $properties = \array_merge($parentPropsArr, $properties);
                }
            }
            static::$classProperties[$className] = \array_keys($properties);
        }

        return static::$classProperties[$className];
    }