function merger(deep) {
  for (var _len = arguments.length, objects = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
    objects[_key - 1] = arguments[_key];
  }

  var o = objects[0];
  var t, i, l, k;

  for (i = 1, l = objects.length; i < l; i++) {
    t = objects[i];

    for (k in t) {
      if (deep && _type["default"].object(t[k]) && !(t[k] instanceof _monkey.Monkey) && k !== '__proto__' && k !== 'constructor' && k !== 'prototype') {
        o[k] = merger(true, o[k] || {}, t[k]);
      } else {
        o[k] = t[k];
      }
    }
  }

  return o;
}
Function taking n objects to merge them together.
Note 1): the latter object will take precedence over the first one.
Note 2): the first object will be mutated to allow for perf scenarios.
Note 3): this function will consider monkeys as leaves.

@param  {boolean}   deep    - Whether the merge should be deep or not.
@param  {...object} objects - Objects to merge.
@return {object}            - The merged object.