public function getOptional(int $type = AII::TYPE_BUILTIN | AII::TYPE_UNTYPED | AII::TYPE_CLASS):array
    {
        $includeUntyped = ($type & AII::TYPE_UNTYPED) === AII::TYPE_UNTYPED;
        $includeBuiltin = ($type & AII::TYPE_BUILTIN) === AII::TYPE_BUILTIN;
        $includeClass = ($type & AII::TYPE_CLASS) === AII::TYPE_CLASS;

        $names = [];
        foreach ($this->info->getNames() as $name) {
            if ($this->info->isRequired($name) ) {
                continue;
            }
            if ($this->hasExplicitValue($name)) {
                continue;
            }
            $type = $this->getType($name);
            if ( ! $includeUntyped && is_null($type) ) {
                continue;
            }
            if ( ! $includeBuiltin && ! is_null($type) && Reflector::isBuiltinType($type) ) {
                continue;
            }
            if ( ! $includeClass && ! is_null($type) && ! Reflector::isBuiltinType($type) ) {
                continue;
            }
            $names[] = $name;
        }
        return $names;
    }