Creates a shallow copy of an object, an array or a primitive
function shallowCopy(src, dst) {
  var i = 0;
  if (isArray(src)) {
    dst = dst || [];

    for (; i < src.length; i++) {
      dst[i] = src[i];
    }
  } else if (isObject(src)) {
    dst = dst || {};

    var keys = Object.keys(src);

    for (var l = keys.length; i < l; i++) {
      var key = keys[i];

      if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) {
        dst[key] = src[key];
      }
    }
  }

  return dst || src;
}