docs: function(compute, func, context, setCachedValue) {
              var readInfo,
                  onchanged,
                  batchNum;
  
              return {
                  // Set up handler for when the compute changes
                  on: function(updater) {
                      if (!onchanged) {
                          onchanged = function(ev) {
                              if (compute.bound && (ev.batchNum === undefined || ev.batchNum !== batchNum)) {
                                  // Keep the old value
                                  var oldValue = readInfo.value;
  
                                  // Get the new value
                                  readInfo = getValueAndBind(func, context, readInfo.observed, onchanged);
  
                                  // Call the updater with old and new values
                                  updater(readInfo.value, oldValue, ev.batchNum);
  
                                  batchNum = batchNum = ev.batchNum;
                              }
                          };
                      }
  
                      readInfo = getValueAndBind(func, context, {}, onchanged);
  
                      setCachedValue(readInfo.value);
  
                      compute.hasDependencies = !can.isEmptyObject(readInfo.observed);
                  },
                  // Remove handler for the compute
                  off: function(updater) {
                      for (var name in readInfo.observed) {
                          var ob = readInfo.observed[name];
                          ob.obj.unbind(ob.event, onchanged);
                      }
                  }
              };
          }