I have done some soul searching about which direction to take Yaro in. I decided to keep it simple. I was tempted to make everything evaluate lazily so that yaro request objects would not "go stale" as environ or start_response are changed in WSGI middleware. I may continue to toy with the idea of lazy attributes, but for now I feel that it is much more elegant and useful to keep the scope tight. Instead of trying to accommodate creeping complexity, I have ripped it out at the root.
A yaro request object is a representation of the WSGI environment at a point in time. If changes are made to the environment, you simply need a fresh request object. For this reason, the caching of yaro request objects has been removed.
Many thanks to Wesley Augur.