*
@method underscore()
@returns String
@short Converts hyphens and camel casing to underscores.
@example

'a-farewell-to-arms'.underscore() -> 'a_farewell_to_arms'
'capsLock'.underscore()           -> 'caps_lock'

*
function() {
      return this
        .replace(/[-\s]+/g, '_')
        .replace(string.Inflector && string.Inflector.acronymRegExp, function(acronym, index) {
          return (index > 0 ? '_' : '') + acronym.toLowerCase();
        })
        .replace(/([A-Z\d]+)([A-Z][a-z])/g,'$1_$2')
        .replace(/([a-z\d])([A-Z])/g,'$1_$2')
        .toLowerCase();
    }