class Thor::Options

def parse(args, skip_leading_non_opts = true)

def parse(args, skip_leading_non_opts = true)
  @args = args
  # start with Thor::Options::Hash pre-filled with defaults
  hash = Hash.new @defaults
  
  @leading_non_opts = []
  if skip_leading_non_opts
    @leading_non_opts << shift until current_is_option? || @args.empty?
  end
  while current_is_option?
    case shift
    when SHORT_SQ_RE
      unshift $1.split('').map { |f| "-#{f}" }
      next
    when EQ_RE, SHORT_NUM
      unshift $2
      switch = $1
    when LONG_RE, SHORT_RE
      switch = $1
    end
    
    switch    = normalize_switch(switch)
    nice_name = undasherize(switch)
    type      = switch_type(switch)
    
    case type
    when :required
      assert_value!(switch)
      raise Error, "cannot pass switch '#{peek}' as an argument" if valid?(peek)
      hash[nice_name] = shift
    when :optional
      hash[nice_name] = peek.nil? || valid?(peek) || shift
    when :boolean
      hash[nice_name] = true
    when :numeric
      assert_value!(switch)
      unless peek =~ NUMERIC and $& == peek
        raise Error, "expected numeric value for '#{switch}'; got #{peek.inspect}"
      end
      hash[nice_name] = $&.index('.') ? shift.to_f : shift.to_i
    end
  end
  
  @trailing_non_opts = @args
  check_required! hash
  hash.freeze
  hash
end