docs: function (el, attrName, val) {
  			var usingMutationObserver = isOfGlobalDocument(el) && getMutationObserver();
  			attrName = attrName.toLowerCase();
  			var oldValue;
  			// In order to later trigger an event we need to compare the new value to the old value,
  			// so here we go ahead and retrieve the old value for browsers that don't have native MutationObservers.
  			if (!usingMutationObserver) {
  				oldValue = attr.get(el, attrName);
  			}
  
  			var newValue;
  			var special = attr.special[attrName];
  			var setter = special && special.set;
  			var test = getSpecialTest(special);
  
  			// First check if this is a special attribute with a setter.
  			// Then run the special's test function to make sure we should
  			// call its setter, and if so use the setter.
  			// Otherwise fallback to setAttribute.
  			if(typeof setter === "function" && test.call(el)) {
  				// To distinguish calls with explicit undefined, e.g.:
  				// - `attr.set(el, "checked")`
  				// - `attr.set(el, "checked", undefined)`
  				if (arguments.length === 2){
  					newValue = setter.call(el);
  				} else {
  					newValue = setter.call(el, val);
  				}
  			} else {
  				attr.setAttribute(el, attrName, val);
  			}
  
  			if (!usingMutationObserver && newValue !== oldValue) {
  				attr.trigger(el, attrName, oldValue);
  			}
  		}