docs: function copy(source, target, stack, call) {
      /* Check the stack */
      if (stack.indexOf(source) >= 0) {
        throw new TypeError("Unable to (en|de)code object: circular reference detected");
      } else {
        stack.push(source);
      }
  
      /* PhantomJS's arguments are not enumerable */
      if (source.hasOwnProperty('callee') && (typeof(source.length) === 'number')) {
        for (var i = 0; i < source.length; i ++) {
          target[i] = call(source[i], stack);
        }
      } else {
        for (var i in source) {
          target[i] = call(source[i], stack);
        }
      }
  
      /* Pop source from stack and continue */
      stack.pop();
      return target;
    }