module.exports = 
  options: (view) -> view._load ? view._save ? view._remove
  decorate: (view) ->


    for method in ["load", "save", "remove"] then do(method) =>

      # remove is already defined
      if method is "remove" and view.__isCollection
        return

      fn = view["_" + method] || view.storage?[method]

      return unless fn


      view.on method, () ->

        view.set "error", undefined
        view.set "#{method}.error", undefined
        view.set "#{method}.loading", true
        
        view.callstack.push (next) ->
          fn.call view, (err, data) ->
          
            view.set "error", err
            view.set "#{method}.error", err
            view.set "#{method}.loading", false

            return next(err) if err?

            if /save|load/.test(method) and data
              view.reset(data)

            next()
