code: function BoxedState(getState, saveState, options) {
      if (!isFunction(getState)) {
          throw new TypeError("InvalidArgument, getState must be a function, got " + getState);
      }
      if (saveState && !isFunction(saveState)) {
          throw new TypeError("InvalidArgument, saveState must be a function, got " + saveState);
      }
  
      options = options || {};
  
      let box;
  
      if (isValidBox(options)) {
          box = options;
          options = {};
      } else {
          box = firstDefined(isValidBox(options.box) ? options.box : undefined, boxedImmutable.box);
      }
  
      let saveBoxedProp = firstDefined(options.saveBoxedProp, 'save');
      let cancelBoxedProp = firstDefined(options.saveBoxedProp, 'cancel');
      let boxOptionsProp = firstDefined(options.boxOptionsProp, 'boxOptions');
  
      // add context
      this.box = box;
      this.saveBoxedProp = saveBoxedProp;
      this.cancelBoxedProp = cancelBoxedProp;
      this.boxOptionsProp = boxOptionsProp;
      this.getState = getState;
      this.saveState = saveState;
      this.boxOnlyOptions = getBoxOnlyOptions(options);
      this.boxed = UNDEFINED;
      this.proxiedThis = UNDEFINED;
  
      this.getBoxed = this.getBoxed.bind(this);
      this.saveBoxed = this.saveBoxed.bind(this);
      this.cancelBoxed = this.cancelBoxed.bind(this);
      this.boxOptions = this.boxOptions.bind(this);
  }
docs: create a new Boxed property or object
  @param getState     get state callback which returns state to use for boxing
  @param saveState    save state callback saveState(boxed.$_modified$, boxed, onDoneCallback),
  value returned from this callback is returned to caller of .save(onDoneCallback)
  @param options      box or options object
  if options object:
  box: box to use or global require('boxed-immutable').box
  saveBoxedProp: property name to use for save, default 'save'
  cancelBoxedProp:  property name to use for cancel, default 'cancel'
  
  + additional box only options for creating the box