text: 'use strict';
  
  const StrictModeError = require('../../error/strict');
  
  /*!
   * ignore
   */
  
  module.exports = function(schematype) {
    if (schematype.$immutable) {
      schematype.$immutableSetter = createImmutableSetter(schematype.path,
        schematype.options.immutable);
      schematype.set(schematype.$immutableSetter);
    } else if (schematype.$immutableSetter) {
      schematype.setters = schematype.setters.
        filter(fn => fn !== schematype.$immutableSetter);
      delete schematype.$immutableSetter;
    }
  };
  
  function createImmutableSetter(path, immutable) {
    return function immutableSetter(v) {
      if (this == null || this.$__ == null) {
        return v;
      }
      if (this.isNew) {
        return v;
      }
  
      const _immutable = typeof immutable === 'function' ?
        immutable.call(this, this) :
        immutable;
      if (!_immutable) {
        return v;
      }
  
      const _value = this.$__getValue(path);
      if (this.$__.strictMode === 'throw' && v !== _value) {
        throw new StrictModeError(path, 'Path `' + path + '` is immutable ' +
          'and strict mode is set to throw.', true);
      }
  
      return _value;
    };
  }
  