code: function(key, fn) {
          var attrs = this,
              $$observers = (attrs.$$observers || (attrs.$$observers = {})),
              listeners = ($$observers[key] || ($$observers[key] = []));
  
          listeners.push(fn);
          $rootScope.$evalAsync(function() {
            if (!listeners.$$inter) {
              // no one registered attribute interpolation function, so lets call it manually
              fn(attrs[key]);
            }
          });
          return fn;
        }
docs: Observe an interpolated attribute.
  The observer will never be called, if given attribute is not interpolated.
  
  @param {string} key Normalized key. (ie ngAttribute) .
  @param {function(*)} fn Function that will be called whenever the attribute value changes.
  @returns {function(*)} the `fn` Function passed in.