attrs.go
func (a *Attrs) SetAttr(key string, value interface{}) *Attrs {
	a.attrsLock.Lock()
	defer a.attrsLock.Unlock()

	valVal := reflect.ValueOf(value)
	switch valVal.Kind() {
	case reflect.Func:
		value = valVal.Type().String()
	}

	hash := getAttrHash(key)
	a.attrs[hash] = value
	return a
}
func (a *Attrs) SetAttr(key string, value interface{}) *Attrs {
	a.attrsLock.Lock()
	defer a.attrsLock.Unlock()

	valVal := reflect.ValueOf(value)
	switch valVal.Kind() {
	case reflect.Func:
		value = valVal.Type().String()
	}

	hash := getAttrHash(key)
	a.attrs[hash] = value
	return a
}
// SetAttr will set key to the provided value.  If the attribute already exists the value will
// be replaced with the new value.