protected function parseMethod(TokenStream $stream, $visibility, $name)
    {
        switch ($visibility->getValue()) {
            case '+':
                $this->nodes[] = new Node(self::NODE_PUBLIC_METHOD, $name->getValue());
                break;
            case '#':
                $this->nodes[] = new Node(self::NODE_PROTECTED_METHOD, $name->getValue());
                break;
            case '-':
                $this->nodes[] = new Node(self::NODE_PRIVATE_METHOD, $name->getValue());
                break;
        }

        $stream->next();
        while (!$this->skip($stream)->is(Lexer::TOKEN_METC)) {
            $token = $stream->expect(Lexer::TOKEN_NODE);
            $this->nodes[] = new Node(self::NODE_ARGUMENT, $token->getValue());
            if ($this->skip($stream)->is(Lexer::TOKEN_TYPE)) {
                $stream->next();
                $token = $stream->expect(Lexer::TOKEN_NODE);
                $this->nodes[] = new Node(self::NODE_ARGUMENT_TYPE, $token->getValue());
            }
        }

        $stream->next();
        if ($this->skip($stream)->is(Lexer::TOKEN_TYPE)) {
            $stream->next();
            $token = $this->skip($stream)->expect(Lexer::TOKEN_NODE);
            $this->nodes[] = new Node(self::NODE_RETURN_TYPE, $token->getValue());
        }

        $this->parseComment($stream, self::NODE_METHOD_COMMENT);
    }