code: function(key, val, options) {
        var attr, attrs;
        if (key == null) return this;
  
        // Handle both `"key", value` and `{key: value}` -style arguments.
        if (_.isObject(key)) {
          attrs = key;
          options = val;
        } else {
          (attrs = {})[key] = val;
        }
  
        // Extract attributes and options.
        var silent = options && options.silent;
        var unset = options && options.unset;
  
        // Run validation.
        if (!this._validate(attrs, options)) return false;
  
        // Check for changes of `id`.
        if (this.idAttribute in attrs) this.id = attrs[this.idAttribute];
  
        var now = this.attributes;
  
        // For each `set` attribute...
        for (attr in attrs) {
          val = attrs[attr];
  
          // Update or delete the current value, and track the change.
          unset ? delete now[attr] : now[attr] = val;
          this._changes.push(attr, val);
        }
  
        // Signal that the model's state has potentially changed, and we need
        // to recompute the actual changes.
        this._hasComputed = false;
  
        // Fire the `"change"` events.
        if (!silent) this.change(options);
        return this;
      }
docs: Set a hash of model attributes on the object, firing `"change"` unless you choose to silence it.