code: function (binding, subpath, preserve, newValue) {
        var args = Util.resolveArgs(
          arguments,
          function (x) { return x instanceof Binding ? 'binding' : null; },
          function (x) { return Util.canRepresentSubpath(x) ? 'subpath' : null; },
          function (x) { return typeof x === 'boolean' ? 'preserve' : null; },
          'newValue'
        );
        return this.update(args.binding, args.subpath, merge.bind(null, args.preserve, args.newValue));
      }
docs: Deep merge values.
  @param {Binding} [binding] binding to apply update to
  @param {String|Array} [subpath] subpath as a dot-separated string or an array of strings and numbers
  @param {Boolean} [preserve=false] preserve existing values when merging
  @param {*} newValue new value
  @return {TransactionContext} updated transaction context