private function addPropToCache($propName)
    {
        $this->propCache[$propName] = [
            'accessors' => [
                'get'   => false,
                'set'   => false,
                'isset' => false,
            ],
            'type' => null,
        ];
        $reflection           = new \ReflectionClass(get_class($this));
        if ($reflection->hasProperty($propName)) {
            $docComment       = $reflection->getProperty($propName)
                ->getDocComment();
            $parsedDocComment = phpDocParser\parseDocComment($docComment);
            // Lambda
            $getTagByName = function ($name, array $tags) {
                foreach ($tags as $tag) {
                    if ($tag['name'] === $name) {
                        return $tag;
                    }
                }
                return null;
            };
            if (($rawType = $getTagByName('var', $parsedDocComment['tags'])) !== null) {
                if (!is_null($rawType['type'])) {
                    $this->propCache[$propName]['type'] = $rawType['type'];
                }
            }
            if (!is_null($getTagByName('accessors', $parsedDocComment['tags']))) {
                array_walk(
                    $this->propCache[$propName]['accessors'],
                    function (&$value) {
                        $value = true;
                    }
                );
            } else {
                if (!is_null($getTagByName('get', $parsedDocComment['tags']))) {
                    $this->propCache[$propName]['accessors']['get'] = true;
                }
                if (!is_null($getTagByName('set', $parsedDocComment['tags']))) {
                    $this->propCache[$propName]['accessors']['set'] = true;
                }
                if (!is_null($getTagByName('isset', $parsedDocComment['tags']))) {
                    $this->propCache[$propName]['accessors']['isset'] = true;
                }
            }
        }
    }