docs: function(func, context, oldObserved, onchanged) {
              // Call the function, get the value as well as the observed objects and events
              var info = can.__read(func, context),
                  // The objects-event pairs that must be bound to
                  newObserveSet = info.observed,
                  // A flag that is used to determine if an event is already being observed.
                  obEv,
                  name;
              // Go through what needs to be observed.
              for (name in newObserveSet) {
  
                  if (oldObserved[name]) {
                      // After binding is set up, values
                      // in `oldObserved` will be unbound. So if a name
                      // has already be observed, remove from `oldObserved`
                      // to prevent this.
                      delete oldObserved[name];
                  } else {
                      // If current name has not been observed, listen to it.
                      obEv = newObserveSet[name];
                      obEv.obj.bind(obEv.event, onchanged);
                  }
              }
  
              // Iterate through oldObserved, looking for observe/attributes
              // that are no longer being bound and unbind them.
              for (name in oldObserved) {
                  obEv = oldObserved[name];
                  obEv.obj.unbind(obEv.event, onchanged);
              }
  
              return info;
          }