code: function(key, val, options) {
      var opts = options || {};
      var self = this;
      var attrs;
      /* eslint no-eq-null: 0*/
      if (key == null || typeof key === 'object') {
        opts = val || {};
        attrs = key;
      } else if (key) {
        (attrs = {})[key] = val;
      }
      // if saving only specified attributes, call set,
      // since preSave may depend on changed attributes
      if (attrs) {
        this.set(attrs, opts);
      }
      var error = opts.error;
      var fns = [
        _.bind(self.preSave, self, opts),
        _.bind(PromisedModel.prototype.save, self, key, opts),
        _.bind(self.afterSave, self, opts)
      ];
      return sequence(fns).then(function(results) {
        return results[1];
      }, function(err) {
        if (error) error.call(opts, self, err);
        return failWithError(opts, err);
      });
    }
docs: ## BaseModel.prototype.save
  
  save extends backbone-blueprint's save by adding calls to lifecycle methods
  
  @param {String/Object} key   key to be saved
  @param {Any} val value
  @param {Object} options Options
  @returns {Promise} promise