define [
  'q'
  'backbone'
], (Q, Backbone) ->

  _sync = Backbone.sync

  Backbone.sync = (method, model, options) ->

    _success = options.success
    _error = options.error

    deferred = Q.defer()

    options.success = (model, response, options) ->
      _success(model, response, options) if _success
      deferred.resolve(model)

    options.error = (model, response, options) ->
      _error(model, response, options) if _error
      deferred.reject(response)

    _sync(method, model, options)

    deferred.promise
