var obsCbs = obsCbs || [];
var obsObjs = obsObjs || [];
var cloneObjs = cloneObjs || [];

function newOne(obj) {
  obsObjs.push(obj);
  obsCbs.push([]);
  cloneObjs.push(Object.assign({}, obj));
}

module.exports = {
  del(obj, cb) {
    let curObjIdx = obsObjs.indexOf(obj);

    if (~curObjIdx) {
      let cbs = obsCbs[curObjIdx];
      let curCbIdx = cbs.indexOf(cb);

      if (~curCbIdx) {
        cbs.splice(curCbIdx, 1);

        if (!cbs.length) {
          obsObjs.splice(curObjIdx, 1);
        }
      }
    }
  },

  add(obj, cb) {
    let curIdx = obsObjs.indexOf(obj);

    if (!~curIdx) {
      curIdx = obsObjs.length;
      newOne(obj);
    }

    let cbs = obsCbs[curIdx];
    cbs.push(cb);

    for (let key in obj) {
      Object.defineProperty(obj, key, {
        set: function (val) {
          cloneObjs[curIdx][key] = val;

          for (let i = 0; i < cbs.length; i++) {
            cbs[i].apply(obj, [val, key]);
          }
        },
        get: function () {
          return cloneObjs[curIdx][key];
        }
      });
    }

    return obj;
  }

};