code: function(fields, value, options) {
              fields  = this.__resolveFields(fields);
              options = this.__resolveOptions(options);
  
              var property = fields.shift();
  
              if (options.check) {
                  this.__checkProperty(property, {
                      writable: true,
                      method:   'set',
                      params:   _.toArray(arguments)
                  });
              }
  
              var field, container;
  
              if (fields.length) {
                  field     = _.last(fields);
                  container = this.__getPropertyValue([property].concat(fields).slice(0, -1), false);
              }
              else {
                  field     = '_' + property;
                  container = this;
              }
  
              var wasExisted = field in container;
              var oldValue   = container[field];
              var newValue   = this.__applySetters(property, value, fields);
  
              container[field] = newValue;
  
              if (options.emit && this.__checkEmitEvent()) {
                  this.__emitPropertySet([property].concat(fields), newValue, oldValue, wasExisted);
              }
  
              return this;
          }
docs: Sets property value
  
  @param {string|array} fields   Property fields
  @param {*}            value    Property value
  @param {object}       options  Options (emit, check)
  @returns {clazz|object} this
  
  @this {clazz|object}