private MethodST method() throws UnexpectedTokenException
	{
		StringBuilder signature = new StringBuilder();
		this.expect(PLUS, MINUS, TILDE);
		signature.append(this.getToken().data);
		this.nextToken();
		this.expect(IDENT);
		String type = this.type();
		signature.append(type);
		this.expect(LPAREN, IDENT);
		if(this.accept(LPAREN))
		{
			signature.append('(');
			this.nextToken();
			while(!this.accept(RPAREN))
			{
				this.expect(NATIVE, SYNC, STATIC, FINAL, ABSTRACT);
				signature.append(this.getToken().data);
				this.nextToken();
				this.expect(COMMA, RPAREN);

				if(this.accept(COMMA))
				{
					signature.append(',');
					this.nextToken();
					this.expect(NATIVE, SYNC, STATIC, FINAL, ABSTRACT);
				}
			}
			signature.append(')');
			this.nextToken();
		}
		this.expect(IDENT);
		String name = this.getToken().data;
		this.nextToken();
		this.expect(LPAREN, LBRACE);
		List<ArgumentPair> args = new ArrayList<ArgumentPair>();
		if(this.accept(LPAREN))
		{
			this.nextToken();
			while(!this.accept(RPAREN))
			{
				this.expect(IDENT);
				String atype = this.type();
				this.nextToken();
				this.expect(IDENT);
				String aname = this.getToken().data;
				args.add(new ArgumentPair(aname, atype));
				this.nextToken();
				this.expect(COMMA, RPAREN);

				if(this.accept(COMMA))
				{
					this.nextToken();
					this.expect(IDENT);
				}
			}
			this.nextToken();
		}

		MethodST method = new MethodST(ACC.parse(signature.toString()), name, type);
		for(ArgumentPair arg : args)
			method.arguments.add(arg);

		this.expect(LBRACE);
		while(!this.accept(RBRACE))
		{
			// TODO
			this.nextToken();
		}

		return method;
	}