I find it a bit strange that render() returns void and string cast does the render. Would the following interface work?

* `prepare()` or `execute()` - Do the work/generate data for the cell.
* `render()` or `__toString()` - Process the cell if it hasn't been processed already and generate the resulting output.