Edit in JSFiddle

;(function(){
  'use strict';

  function AugmentedDeferredService($q) {

    this.defer = function() {
      var deferred = $q.defer(),
        promise = deferred.promise,
        isResolved = false,
        isRejected = false,
        updateCallbackQueue = [];

      // Retain the initial values
      var nonDecoratedValues = {
        resolve: deferred.resolve,
        reject: deferred.reject,
        then: promise.then
      };

      // Augment the methods resolve, reject, then, update
      deferred.resolve = function() {
        if(isResolved && !isRejected) {
          updateCallbackQueue.forEach(function(cb){
            cb.apply({}, arguments);
          });
        } else {
          isResolved = true;
          nonDecoratedValues.resolve.apply(deferred, arguments);
        }
      };

      deferred.reject = function() {
        if(!isResolved){
          isRejected = true;
          nonDecoratedValues.reject.apply(deferred, arguments);
        }
      };

      promise.then = function() {
        var augmentedPromise = nonDecoratedValues.then.apply(promise, arguments);
        augmentedPromise.update = promise.update;
        return augmentedPromise;
      };

      promise.update = function(cb) {
        updateCallbackQueue.push(cb);
        return promise;
      }

      return deferred;
    };

  }

  AugmentedDeferredService.$inject = ['$q'];

  angular
    .module('app')
    .service('AugmentedDeferredService', AugmentedDeferredService);
})();