docs: function(el, attrName, val) {
                      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 (!attr.MutationObserver) {
                          oldValue = attr.get(el, attrName);
                      }
  
                      var tagName = el.nodeName.toString()
                          .toLowerCase(),
                          prop = attr.map[attrName],
                          newValue;
  
                      // Using the property of `attr.map`, go through and check if the property is a function, and if so call it. Then check if the property is `true`, and if so set the value to `true`, also making sure to set `defaultChecked` to `true` for elements of `attr.defaultValue`. We always set the value to true because for these boolean properties, setting them to false would be the same as removing the attribute.
                      // For all other attributes use `setAttribute` to set the new value.
                      if (typeof prop === "function") {
                          newValue = prop(el, val);
                      } else if (prop === true) {
                          newValue = el[attrName] = true;
  
                          if (attrName === "checked" && el.type === "radio") {
                              if (can.inArray(tagName, attr.defaultValue) >= 0) {
                                  el.defaultChecked = true;
                              }
                          }
  
                      } else if (prop) {
                          newValue = el[prop] = val;
                          if (prop === "value" && can.inArray(tagName, attr.defaultValue) >= 0) {
                              el.defaultValue = val;
                          }
                      } else {
                          el.setAttribute(attrName, val);
                          newValue = val;
                      }
  
                      // Now that the value has been set, for browsers without MutationObservers, check to see that value has changed and if so trigger the "attributes" event on the element.
                      if (!attr.MutationObserver && newValue !== oldValue) {
                          attr.trigger(el, attrName, oldValue);
                      }
                  }