render falls back to toString