def stylize string, styles = []
      [styles].flatten.inject(string) do |str, style|
        style = style.to_sym
        if ANSI[:transforms].include? style
          esc str, *ANSI[:transforms][style]
        elsif ANSI[:colors].include? style
          esc str, ANSI[:colors][style], ANSI[:colors][:reset]
        else
          stylize(str, @styles[style][:style])
        end
      end
    end
def stylize string, styles = []
      [styles].flatten.inject(string) do |str, style|
        style = style.to_sym
        if ANSI[:transforms].include? style
          esc str, *ANSI[:transforms][style]
        elsif ANSI[:colors].include? style
          esc str, ANSI[:colors][style], ANSI[:colors][:reset]
        else
          stylize(str, @styles[style][:style])
        end
      end
    end
Apply styles to a string

   if the style is a default ANSI style, we add the start
   and end sequence to the string.

   if the style is a custom style, we recurse, sending
   the list of ANSI styles contained in the custom style.

   TODO: use ';' delimited codes instead of multiple \e sequences