package sbt

	import java.io.Writer

/** A `Writer` that avoids constructing the underlying `Writer` with `make` until a method other than `close` is called on this `Writer`. */
final class DeferredWriter(make: => Writer) extends Writer
{
	private[this] var opened = false
	private[this] var delegate0: Writer = _
	private[this] def delegate: Writer = synchronized {
		if(delegate0 eq null) {
			delegate0 = make
			opened = true
		}
		delegate0
	}
	override def close() = synchronized {
		if(opened) delegate0.close()
	}

	override def append(c: Char): Writer = delegate.append(c)
	override def append(csq: CharSequence): Writer = delegate.append(csq)
	override def append(csq: CharSequence, start: Int, end: Int): Writer = delegate.append(csq, start, end)
	override def flush() = delegate.flush()
	override def write(cbuf: Array[Char]) = delegate.write(cbuf)
	override def write(cbuf: Array[Char], off: Int, len: Int): Unit = delegate.write(cbuf, off, len)
	override def write(c: Int): Unit = delegate.write(c)
	override def write(s: String): Unit = delegate.write(s)
	override def write(s: String, off: Int, len: Int): Unit = delegate.write(s, off, len)
}