class Protocol {

    public String writeCommand(String command, Argument args) 
		throws IOException, ProtocolException {
	// assert Thread.holdsLock(this);
	// can't assert because it's called from constructor
	String tag = tagPrefix + Integer.toString(tagCounter++); // unique tag

	output.writeBytes(tag + " " + command);
    
	if (args != null) {
	    output.write(' ');
	    args.write(this);
	}

	output.write(CRLF);
	output.flush();
	return tag;
    }

    public  Protocol(String host, int port, 
		    Properties props, String prefix,
		    boolean isSSL, MailLogger logger);
    public  Protocol(InputStream in, PrintStream out, Properties props,
				boolean debug);

}