docs: function (obj, options) {
          var instance = this,
              i = -1,
              deepForce, keys, l, key, force, replace, descriptors, propDescriptor;
          if (!Object.itsa_isObject(obj)) {
              return instance;
          }
          options || (options={});
          keys = options.full ? Object.getOwnPropertyNames(obj) : Object.keys(obj);
          l = keys.length;
          force = options.force;
          deepForce = (force==="deep");
          replace = options.replace;
          descriptors = options.descriptors;
          // we cannot use obj.each --> obj might be an object defined through Object.create(null) and missing Object.prototype!
          while (++i < l) {
              key = keys[i];
              if ((force && !replace) || (!replace && !(key in instance)) || (replace && (key in instance))) {
                  if (deepForce && Object.itsa_isObject(instance[key]) && Object.itsa_isObject(obj[key])) {
                      instance[key].itsa_merge(obj[key], options);
                  }
                  else {
                      if (descriptors) {
                          propDescriptor = Object.getOwnPropertyDescriptor(obj, key);
                          if (!propDescriptor.writable) {
                              instance[key] = obj[key];
                          }
                          else {
                              Object.defineProperty(instance, key, propDescriptor);
                          }
                      }
                      else {
                          instance[key] = obj[key];
                      }
                  }
              }
          }
          return instance;
      }