code: function TRANSITION_TIMING_FUNCTION_VALIDATOR(v) {
    v = (v || '').toString()
  
    if (v.match(/^linear|ease|ease-in|ease-out|ease-in-out$/)) {
      return {value: v}
    }
  
    var match, ret
    var NUM_REGEXP = /^[-]?\d*\.?\d+$/
    if (match = v.match(/^cubic-bezier\(\s*(.*)\s*,\s*(.*)\s*,\s*(.*)\s*,\s*(.*)\s*\)$/)) {
      /* istanbul ignore else */
      if (match[1].match(NUM_REGEXP) && match[2].match(NUM_REGEXP) && match[3].match(NUM_REGEXP) && match[4].match(NUM_REGEXP)) {
        ret = [parseFloat(match[1]), parseFloat(match[2]), parseFloat(match[3]), parseFloat(match[4])].join(',')
        return {value: 'cubic-bezier(' + ret + ')'}
      }
    }
  
    return {
      value: null,
      reason: function reason(k, v, result) {
        return 'ERROR: property value `' + v + '` is not supported for `' + util.camelCaseToHyphened(k) + '` (supported values are: `linear`|`ease`|`ease-in`|`ease-out`|`ease-in-out`|`cubic-bezier(n,n,n,n)`)'
      }
    }
  }
docs: transition-timing-function: only linear|ease|ease-in|ease-out|ease-in-out|cubic-bezier(n,n,n,n) is valid
  
  @param {string} v
  @return {function} a function to return
  - value: linear|ease|ease-in|ease-out|ease-in-out|cubic-bezier(n,n,n,n)|null
  - reason(k, v, result)