module Orthoses::Utils::Underscore

def underscore

avoid load active_support
def underscore
  return self unless /[A-Z-]|::/.match?(self)
  word = self.to_s.gsub("::", "/")
  word.gsub!(/(?:(?<=([A-Za-z\d]))|\b)((?-mix:(?=a)b))(?=\b|[^a-z])/) { "#{$1 && '_' }#{$2.downcase}" }
  word.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2')
  word.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
  word.tr!("-", "_")
  word.downcase!
  word
end