Currently an observer can act as a filter or translator but cannot stop a subsequent call down to the base method for get, put, delete, etc. This means an observer cannot completely override the base function. To deal with this we can:
- Change the preXXX methods to return the same type as the postXXX methods, the same return type of the base method.
- Extend Coprocessor.Environment with methods that get/set a "should continue" flag.
The framework should check the "should continue" flag before calling the base method. If not, just return what was returned by the preXXX method.