toString

render

Invoked on an object to request that it render itself. This involves a mix of invoking methods on the writer, and
queueing up additional commands (often, representing children of the object that was invoked) to perform
additional rendering.

In this way, rendering is a tail recursive algorithm, but is not implemented using tail recursion.