def render(fn, scope = nil, buffer = "")
      if scope.nil?
        case fn
          when String       then buffer << fn
          when Proc         then fn.call(self, buffer)
          when Template     then fn.call(@scope, buffer)
          when TiltTemplate then buffer << fn.render(@scope)
          else
            raise ArgumentError, "Unable to render `#{fn}`"
        end
        buffer
      else
        with_scope(scope){ render(fn, nil, buffer) }
      end
    end
def render(fn, scope = nil, buffer = "")
      if scope.nil?
        case fn
          when String       then buffer << fn
          when Proc         then fn.call(self, buffer)
          when Template     then fn.call(@scope, buffer)
          when TiltTemplate then buffer << fn.render(@scope)
          else
            raise ArgumentError, "Unable to render `#{fn}`"
        end
        buffer
      else
        with_scope(scope){ render(fn, nil, buffer) }
      end
    end
rendering
 Renders `fn` to a `buffer`, optionally extending the current scope.

 `fn` can either be a String (immediately pushed on the buffer), a Proc (taken as a
 tag block to render further), or a Template (taken as a partial to render in the
 current scope).

 Is `scope` is specified, the current scope is first branched to use to new one in
 priority, then rendering applies and the newly created scope if then poped.

 Returns the buffer.