def educate stream=$stdout
    width # hack: calculate it now; otherwise we have to be careful not to
          # call this unless the cursor's at the beginning of a line.
    left = {}
    cols = {}
    @specs.each do |name, spec|

      s_type = case spec[:type]
        when :flag; ""
        when :int; " <i>"
        when :ints; " <i+>"
        when :string; " <s>"
        when :strings; " <s+>"
        when :float; " <f>"
        when :floats; " <f+>"
        when :io; " <filename/uri>"
        when :ios; " <filename/uri+>"
        when :date; " <date>"
        when :dates; " <date+>"
      end

      cols[name] = [
        (spec[:short] && spec[:short] != :none ? "-#{spec[:short]}" : ""),
        (spec[:type] == :flag && spec[:default] ? "--#{spec[:long]}; --no-#{spec[:long]}" : "--#{spec[:long]}"),
        (spec[:ex] ? "[#{spec[:ex]}]" : ""),
        s_type
      ]
    end

    widths = (0..3).map {|index|
      cols.max_by{|x| x[1][index].length }[1][index].length
    }
    

    unless @order.size > 0 && @order.first.first == :text
      stream.puts "#@version\n" if @version
      stream.puts "Options:"
    end

    @order.each do |what, opt|
      if what == :text
        stream.puts wrap(opt)
        next
      end

      spec = @specs[opt]
      stream.printf "    %-#{widths[0]+2}s %-#{widths[1]+2}s %#{widths[2]+2}s -  ", *cols[opt]
      desc = spec[:desc] + begin
        default_s = case spec[:default]
        when $stdout; "<stdout>"
        when $stdin; "<stdin>"
        when $stderr; "<stderr>"
        when Array
          spec[:default].join(", ")
        else
          spec[:default].to_s
        end

        if spec[:default]
          if spec[:desc] =~ /\.$/
            " (Default: #{default_s})"
          else
            " (default: #{default_s})"
          end
        else
          ""
        end
      end
      stream.puts wrap(desc)
    end
  end
def educate stream=$stdout
    width # hack: calculate it now; otherwise we have to be careful not to
          # call this unless the cursor's at the beginning of a line.
    left = {}
    cols = {}
    @specs.each do |name, spec|

      s_type = case spec[:type]
        when :flag; ""
        when :int; " <i>"
        when :ints; " <i+>"
        when :string; " <s>"
        when :strings; " <s+>"
        when :float; " <f>"
        when :floats; " <f+>"
        when :io; " <filename/uri>"
        when :ios; " <filename/uri+>"
        when :date; " <date>"
        when :dates; " <date+>"
      end

      cols[name] = [
        (spec[:short] && spec[:short] != :none ? "-#{spec[:short]}" : ""),
        (spec[:type] == :flag && spec[:default] ? "--#{spec[:long]}; --no-#{spec[:long]}" : "--#{spec[:long]}"),
        (spec[:ex] ? "[#{spec[:ex]}]" : ""),
        s_type
      ]
    end

    widths = (0..3).map {|index|
      cols.max_by{|x| x[1][index].length }[1][index].length
    }
    

    unless @order.size > 0 && @order.first.first == :text
      stream.puts "#@version\n" if @version
      stream.puts "Options:"
    end

    @order.each do |what, opt|
      if what == :text
        stream.puts wrap(opt)
        next
      end

      spec = @specs[opt]
      stream.printf "    %-#{widths[0]+2}s %-#{widths[1]+2}s %#{widths[2]+2}s -  ", *cols[opt]
      desc = spec[:desc] + begin
        default_s = case spec[:default]
        when $stdout; "<stdout>"
        when $stdin; "<stdin>"
        when $stderr; "<stderr>"
        when Array
          spec[:default].join(", ")
        else
          spec[:default].to_s
        end

        if spec[:default]
          if spec[:desc] =~ /\.$/
            " (Default: #{default_s})"
          else
            " (default: #{default_s})"
          end
        else
          ""
        end
      end
      stream.puts wrap(desc)
    end
  end
Print the help message to +stream+.