def opt(name, desc = "", opts = {}, &b)
			opts[:callback] ||= b if block_given?
			opts[:desc] ||= desc

			o = Option.create(name, desc, opts)

			raise ArgumentError, "you already have an argument named '#{name}'" if @specs.member? o.name
			raise ArgumentError, "long option name #{o.long.inspect} is already taken; please specify a (different) :long" if @long[o.long]
			raise ArgumentError, "short option name #{o.short.inspect} is already taken; please specify a (different) :short" if @short[o.short]
			raise ArgumentError, "permitted values for option #{o.long.inspect} must be either nil or an array;" unless o.permitted.nil? or o.permitted.is_a? Array

			@long[o.long] = o.name
			@short[o.short] = o.name if o.short?
			@specs[o.name] = o
			@order << [:opt, o.name]
		end
def opt(name, desc = "", opts = {}, &b)
			opts[:callback] ||= b if block_given?
			opts[:desc] ||= desc

			o = Option.create(name, desc, opts)

			raise ArgumentError, "you already have an argument named '#{name}'" if @specs.member? o.name
			raise ArgumentError, "long option name #{o.long.inspect} is already taken; please specify a (different) :long" if @long[o.long]
			raise ArgumentError, "short option name #{o.short.inspect} is already taken; please specify a (different) :short" if @short[o.short]
			raise ArgumentError, "permitted values for option #{o.long.inspect} must be either nil or an array;" unless o.permitted.nil? or o.permitted.is_a? Array

			@long[o.long] = o.name
			@short[o.short] = o.name if o.short?
			@specs[o.name] = o
			@order << [:opt, o.name]
		end
Initializes the parser, and instance-evaluates any block given.
 Define an option. +name+ is the option name, a unique identifier
 for the option that you will use internally, which should be a
 symbol or a string. +desc+ is a string description which will be
 displayed in help messages.

 Takes the following optional arguments:

 [+:long+] Specify the long form of the argument, i.e. the form with two dashes. If unspecified, will be automatically derived based on the argument name by turning the +name+ option into a string, and replacing any _'s by -'s.
 [+:short+] Specify the short form of the argument, i.e. the form with one dash. If unspecified, will be automatically derived from +name+. Use :none: to not have a short value.
 [+:type+] Require that the argument take a parameter or parameters of type +type+. For a single parameter, the value can be a member of +SINGLE_ARG_TYPES+, or a corresponding Ruby class (e.g. +Integer+ for +:int+). For multiple-argument parameters, the value can be any member of +MULTI_ARG_TYPES+ constant. If unset, the default argument type is +:flag+, meaning that the argument does not take a parameter. The specification of +:type+ is not necessary if a +:default+ is given.
 [+:default+] Set the default value for an argument. Without a default value, the hash returned by #parse (and thus Trollop::options) will have a +nil+ value for this key unless the argument is given on the commandline. The argument type is derived automatically from the class of the default value given, so specifying a +:type+ is not necessary if a +:default+ is given. (But see below for an important caveat when +:multi+: is specified too.) If the argument is a flag, and the default is set to +true+, then if it is specified on the the commandline the value will be +false+.
 [+:required+] If set to +true+, the argument must be provided on the commandline.
 [+:multi+] If set to +true+, allows multiple occurrences of the option on the commandline. Otherwise, only a single instance of the option is allowed. (Note that this is different from taking multiple parameters. See below.)

 Note that there are two types of argument multiplicity: an argument
 can take multiple values, e.g. "--arg 1 2 3". An argument can also
 be allowed to occur multiple times, e.g. "--arg 1 --arg 2".

 Arguments that take multiple values should have a +:type+ parameter
 drawn from +MULTI_ARG_TYPES+ (e.g. +:strings+), or a +:default:+
 value of an array of the correct type (e.g. [String]). The
 value of this argument will be an array of the parameters on the
 commandline.

 Arguments that can occur multiple times should be marked with
 +:multi+ => +true+. The value of this argument will also be an array.
 In contrast with regular non-multi options, if not specified on
 the commandline, the default value will be [], not nil.

 These two attributes can be combined (e.g. +:type+ => +:strings+,
 +:multi+ => +true+), in which case the value of the argument will be
 an array of arrays.

 There's one ambiguous case to be aware of: when +:multi+: is true and a
 +:default+ is set to an array (of something), it's ambiguous whether this
 is a multi-value argument as well as a multi-occurrence argument.
 In thise case, Trollop assumes that it's not a multi-value argument.
 If you want a multi-value, multi-occurrence argument with a default
 value, you must specify +:type+ as well.