dist/object.js
function propagateChanges() {
  var seen = {};
  var head = void 0;

  for (var id in changedObjects) {
    var _changedObjects$id = changedObjects[id],
        object = _changedObjects$id.object,
        props = _changedObjects$id.props;

    for (var k in props) {
      head = { object: object, name: k, next: head };
      seen[id + k] = true;
    }
  }

  while (head) {
    var _head = head,
        name = _head.name,
        object = _head.object,
        _head$object = _head.object,
        _objectId = _head$object.objectId,
        __deps__ = _head$object.__deps__,
        __proxies__ = _head$object.__proxies__;

    var deps = __deps__ && __deps__[name];

    head = head.next;

    registerChange(object, name);

    if (object.__cache__) {
      var val = object.__cache__[name];
      if (val && typeof val.unproxy === 'function') {
        val.unproxy(object, name);
      }
      delete object.__cache__[name];
    }

    if (deps) {
      for (var i = 0, n = deps.length; i < n; i++) {
        var seenKey = _objectId + deps[i];

        if (!seen[seenKey]) {
          head = { object: object, name: deps[i], next: head };
          seen[seenKey] = true;
        }
      }
    }

    if (__proxies__ && name.indexOf('.') === -1) {
      for (var _k in __proxies__) {
        var proxy = __proxies__[_k];
        var proxyObject = proxy.object;
        var proxyName = proxy.name + '.' + name;
        var proxySeenKey = proxyObject.objectId + proxyName;

        if (!seen[proxySeenKey]) {
          head = { object: proxyObject, name: proxyName, next: head };
          seen[proxySeenKey] = true;
        }
      }
    }
  }
}
function propagateChanges() {
  var seen = {};
  var head = void 0;

  for (var id in changedObjects) {
    var _changedObjects$id = changedObjects[id],
        object = _changedObjects$id.object,
        props = _changedObjects$id.props;

    for (var k in props) {
      head = { object: object, name: k, next: head };
      seen[id + k] = true;
    }
  }

  while (head) {
    var _head = head,
        name = _head.name,
        object = _head.object,
        _head$object = _head.object,
        _objectId = _head$object.objectId,
        __deps__ = _head$object.__deps__,
        __proxies__ = _head$object.__proxies__;

    var deps = __deps__ && __deps__[name];

    head = head.next;

    registerChange(object, name);

    if (object.__cache__) {
      var val = object.__cache__[name];
      if (val && typeof val.unproxy === 'function') {
        val.unproxy(object, name);
      }
      delete object.__cache__[name];
    }

    if (deps) {
      for (var i = 0, n = deps.length; i < n; i++) {
        var seenKey = _objectId + deps[i];

        if (!seen[seenKey]) {
          head = { object: object, name: deps[i], next: head };
          seen[seenKey] = true;
        }
      }
    }

    if (__proxies__ && name.indexOf('.') === -1) {
      for (var _k in __proxies__) {
        var proxy = __proxies__[_k];
        var proxyObject = proxy.object;
        var proxyName = proxy.name + '.' + name;
        var proxySeenKey = proxyObject.objectId + proxyName;

        if (!seen[proxySeenKey]) {
          head = { object: proxyObject, name: proxyName, next: head };
          seen[proxySeenKey] = true;
        }
      }
    }
  }
}
Internal: Processes recorded property changes by traversing the property dependency graph and forwarding changes to proxy objects.