docs: function (src, target, merge) {
  
                  merge = merge === true;
  
                  var allArray = (typeUtils.isArray(src) && typeUtils.isArray(target));
                  var allObject = (typeUtils.isObject(src) && typeUtils.isObject(target));
                  var elem;
  
                  if (!allArray && !allObject) {
                      return false;
                  }
  
                  if (src === target) {
                      return true;
                  }
  
                  if (allArray) {
                      if (!merge) {
                          for (var i = 0, l = src.length; i < l; i++) {
                              target.push(src[i]);
                          }
                      } else {
                          for (var i = 0, l = src.length; i < l; i++) {
                              elem = src[i];
                              if (!target[i]) {
                                  target[i] = elem;
                              } else {
                                  if (typeUtils.isContainer(elem)) {
                                      // recursive merge
                                      if (!this.inject(elem, target[i], true)) {
                                          // recursive injection is not possible
                                          target[i] = elem;
                                      }
                                  } else if (typeUtils.isDate(elem)) {
                                      target[i] = new Date(elem.getTime());
                                  } else {
                                      // may be a string, number, boolean, or something else: function ...
                                      target[i] = elem;
                                  }
                              }
                          }
                      }
                  } else if (allObject) {
                      for (var key in src) {
                          if (src.hasOwnProperty(key)) {
                              elem = src[key];
                              if (!target[key] || !merge) {
                                  this.setValue(target, key, elem);
                              } else {
                                  if (typeUtils.isContainer(elem)) {
                                      // recursive merge
                                      if (!this.inject(elem, target[key], true)) {
                                          // recursive injection is not possible
                                          this.setValue(target, key, elem);
                                      }
                                  } else if (typeUtils.isDate(elem)) {
                                      this.setValue(target, key, new Date(elem.getTime()));
                                  } else {
                                      // may be a string, number, boolean, or something else: function ...
                                      this.setValue(target, key, elem);
                                  }
                              }
                          }
                      }
                  }
                  return true;
              }