       # convert stringify nested query params
       opts.qs[key] = JSON.stringify val for key, val of opts.qs when _(val).isObject()
       waterfall = [async.apply quest, opts].concat(@_post.exec or [])
-      async.waterfall waterfall, (err, data) ->
-        p.reject err if err
-        p.resolve data
-        return cb?(err) if err
-        cb?(err, data)
+      promise = new Promise (resolve, reject) ->
+        async.waterfall waterfall, (err, data) ->
+          reject err if err
+          resolve data
+          return cb?(err) if err
+          cb?(err, data)
       return cb if _.isFunction(cb)
-      p.promise
+      promise
 
     stream: () => new QueryStream @
 

      @

    exec: (cb) =>
      p = Q.defer()
      opts =
        method: 'get'
        uri: @_url


Clever.handle_errors = handle_errors

Clever.setPromiseProvider = (Provider) ->
  Promise = Provider

Clever.me = (token, url_base..., cb) ->
  url_base = url_base[0]
  url_base ?= API_BASE
