docs: function $AriaProvider() {
    var config = {
      ariaHidden: true,
      ariaChecked: true,
      ariaDisabled: true,
      ariaRequired: true,
      ariaInvalid: true,
      ariaMultiline: true,
      ariaValue: true,
      tabindex: true,
      bindKeypress: true
    };
  
    /**
     * @ngdoc method
     * @name $ariaProvider#config
     *
     * @param {object} config object to enable/disable specific ARIA attributes
     *
     *  - **ariaHidden** – `{boolean}` – Enables/disables aria-hidden tags
     *  - **ariaChecked** – `{boolean}` – Enables/disables aria-checked tags
     *  - **ariaDisabled** – `{boolean}` – Enables/disables aria-disabled tags
     *  - **ariaRequired** – `{boolean}` – Enables/disables aria-required tags
     *  - **ariaInvalid** – `{boolean}` – Enables/disables aria-invalid tags
     *  - **ariaMultiline** – `{boolean}` – Enables/disables aria-multiline tags
     *  - **ariaValue** – `{boolean}` – Enables/disables aria-valuemin, aria-valuemax and aria-valuenow tags
     *  - **tabindex** – `{boolean}` – Enables/disables tabindex tags
     *  - **bindKeypress** – `{boolean}` – Enables/disables keypress event binding on ng-click
     *
     * @description
     * Enables/disables various ARIA attributes
     */
    this.config = function(newConfig) {
      config = angular.extend(config, newConfig);
    };
  
    function watchExpr(attrName, ariaAttr, negate) {
      return function(scope, elem, attr) {
        var ariaCamelName = attr.$normalize(ariaAttr);
        if (config[ariaCamelName] && !attr[ariaCamelName]) {
          scope.$watch(attr[attrName], function(boolVal) {
            if (negate) {
              boolVal = !boolVal;
            }
            elem.attr(ariaAttr, boolVal);
          });
        }
      };
    }
  
    /**
     * @ngdoc service
     * @name $aria
     *
     * @description
     *
     * The $aria service contains helper methods for applying common
     * [ARIA](http://www.w3.org/TR/wai-aria/) attributes to HTML directives.
     *
     * ngAria injects common accessibility attributes that tell assistive technologies when HTML
     * elements are enabled, selected, hidden, and more. To see how this is performed with ngAria,
     * let's review a code snippet from ngAria itself:
     *
     *```js
     * ngAriaModule.directive('ngDisabled', ['$aria', function($aria) {
     *   return $aria.$$watchExpr('ngDisabled', 'aria-disabled');
     * }])
     *```
     * Shown above, the ngAria module creates a directive with the same signature as the
     * traditional `ng-disabled` directive. But this ngAria version is dedicated to
     * solely managing accessibility attributes. The internal `$aria` service is used to watch the
     * boolean attribute `ngDisabled`. If it has not been explicitly set by the developer,
     * `aria-disabled` is injected as an attribute with its value synchronized to the value in
     * `ngDisabled`.
     *
     * Because ngAria hooks into the `ng-disabled` directive, developers do not have to do
     * anything to enable this feature. The `aria-disabled` attribute is automatically managed
     * simply as a silent side-effect of using `ng-disabled` with the ngAria module.
     *
     * The full list of directives that interface with ngAria:
     * * **ngModel**
     * * **ngShow**
     * * **ngHide**
     * * **ngClick**
     * * **ngDblclick**
     * * **ngMessages**
     * * **ngDisabled**
     *
     * Read the {@link guide/accessibility ngAria Developer Guide} for a thorough explanation of each
     * directive.
     *
     *
     * ## Dependencies
     * Requires the {@link ngAria} module to be installed.
     */
    this.$get = function() {
      return {
        config: function(key) {
          return config[key];
        },
        $$watchExpr: watchExpr
      };
    };
  }