protected function extractResponseProperty(
        ActionInterface $action,
        CallableInterface $callable,
        \ReflectionProperty $property
    ) {
        $docBlock = new DocBlock($property);
        $description = $docBlock->getShortDescription();
        $type = 'mixed';
        $child = null;

        $varTags = $docBlock->getTagsByName('var');

        if (count($varTags)) {
            /** @var \phpDocumentor\Reflection\DocBlock\Tag\VarTag $varTag */
            $varTag = $varTags[0];
            $varTypes = $varTag->getTypes();
            $varType = null;

            if (count($varTypes)) {
                $varType = array_pop($varTypes);
            }

            switch (true) {
                case 'int' == $varType:
                case 'integer' == $varType:
                    $type = 'int';
                    break;

                case 'string' == $varType:
                    $type = 'string';
                    break;

                case 'float' == $varType:
                case 'double' == $varType:
                    $type = 'float';
                    break;

                case 'boolean' == $varType:
                case 'bool' == $varType:
                    $type = 'bool';
                    break;

                case 'DateTime' == ltrim($varType, '\\'):
                    $type = 'datetime';
                    break;

                default:
                    if ($varType && class_exists($varType)) {
                        $type = 'object';
                        $childProperties = $this->getPropertiesForClass($action, $callable, $varType);
                        $child = [];

                        foreach ($childProperties as $childProperty) {
                            $child[$childProperty->getName()] = $this->extractResponseProperty(
                                $action,
                                $callable,
                                $childProperty
                            );
                        }

                        break;
                    } else if ($varType && substr($varType, strlen($varType) - 2) == '[]') {
                        $childClass = substr($varType, 0, strlen($varType) - 2);
                        $type = 'collection';
                        $childProperties = $this->getPropertiesForClass($action, $callable, $childClass);
                        $child = [];

                        foreach ($childProperties as $childProperty) {
                            $child[$childProperty->getName()] = $this->extractResponseProperty(
                                $action,
                                $callable,
                                $childProperty
                            );
                        }

                        break;
                    }

                    $this->tryFormatPhpType($varTag, $varType);
            }
        }

        $responseProperty = new ResponseProperty($property->getName(), $type, $description, $child);

        return $responseProperty;
    }