# File lib/lolcat/cat.rb, line 50
  def self.cat!
    p = Trollop::Parser.new do
      version "lolcat #{Lolcat::VERSION} (c)2011 moe@busyloop.net"
      banner "\nUsage: lolcat [OPTION]... [FILE]...\n\nConcatenate FILE(s), or standard input, to standard output.\nWith no FILE, or when FILE is -, read standard input.\n\n"
      banner ''
      opt :spread, "Rainbow spread", :short => 'p', :default => 3.0
      opt :freq, "Rainbow frequency", :short => 'F', :default => 0.1
      opt :seed, "Rainbow seed, 0 = random", :short => 'S', :default => 0
      opt :animate, "Enable psychedelics", :short => 'a', :default => false
      opt :duration, "Animation duration", :short => 'd', :default => 12
      opt :speed, "Animation speed", :short => 's', :default => 20.0
      opt :force, "Force color even when stdout is not a tty", :short => 'f', :default => false
      opt :version,  "Print version and exit", :short => 'v'
      opt :help,  "Show this message", :short => 'h'
      banner "\nExamples:\n  lolcat f - g      Output f's contents, then stdin, then g's contents.\n  lolcat            Copy standard input to standard output.\n  fortune | lolcat  Display a rainbow cookie.\n\nReport lolcat bugs to <http://www.github.org/busyloop/lolcat/issues>\nlolcat home page: <http://www.github.org/busyloop/lolcat/>\nReport lolcat translation bugs to <http://speaklolcat.com/>\n\n"
    end

    opts = Trollop::with_standard_exception_handling p do
      begin
        o = p.parse ARGV
      rescue Trollop::HelpNeeded
        buf = StringIO.new
        p.educate buf
        buf.rewind
        halp! buf.read, {}
        buf.close
      end
      o
    end

    p.die :spread, "must be > 0" if opts[:spread] < 0.1
    p.die :duration, "must be > 0" if opts[:duration] < 0.1
    p.die :speed, "must be > 0.1" if opts[:speed] < 0.1

    opts[:os] = opts[:seed]
    opts[:os] = rand(256) if opts[:os] == 0

    begin
      files = ARGV.empty? ? [:stdin] : ARGV[0..-1]
      files.each do |file|
        fd = ARGF if file == '-' or file == :stdin
        begin
          fd = File.open file unless fd == ARGF

          if $stdout.tty? or opts[:force]
            Lol.cat fd, opts
          else
            until fd.eof? do
              $stdout.write(fd.read(8192))
            end
          end
        rescue Errno::ENOENT
          puts "lolcat: #{file}: No such file or directory"
          exit 1
        rescue Errno::EACCES
          puts "lolcat: #{file}: Permission denied"
          exit 1
        rescue Errno::EISDIR
          puts "lolcat: #{file}: Is a directory"
          exit 1
        rescue Errno::EPIPE
          exit 1
        end
      end
    rescue Interrupt
    end
  end