code: function onchange (parent, prefix) {
    return function (ary) {
      debug('onchange', prefix);
  
      ary.forEach(function (change) {
        var object = change.object;
        var type = change.type;
        var name = change.name;
        var value = object[name];
  
        var path = prefix
          ? prefix + '.' + name
          : name
  
        if ('add' == type && null != value && 'object' == typeof value) {
          new Observable(value, parent, path);
        } else if ('delete' == type && 'object' == typeof change.oldValue) {
          parent._remove(change.oldValue);
        } else if ('update' == type) {
          if(change.oldValue != value) {
            // If we removed an object, then remove the observer too.
            if('object' == typeof change.oldValue) {
              parent._remove(change.oldValue);
            }
            
            // If we changed this with another object, re-observe it.
            if('object' == typeof value) {
              new Observable(value, parent, path);
            }
          } 
        } 
  
        change = new Change(path, change);
        parent.emit(type, change);
        parent.emit(type + ' ' + path, change);
        parent.emit('change', change);
        parent.emit('change' + ' ' + path, change);
      })
    }
  }
docs: /*!
  Creates an Object.observe `onchange` listener