def execute( line=nil )
case line
when String
arguments = Shellwords.shellwords(line)
when Array
arguments = line
else
arguments = ARGV
end
argv = arguments.dup
argv = argv.collect { |arg|
if md = /^-(\w{2,})/.match( arg )
md[1].split(//).collect { |c| "-#{c}" }
else
arg
end
}.flatten
global_options.each do |name|
o = name.to_s.sub('__','--').sub('_','-')
m = method(name)
c = m.arity
while i = argv.index(o)
args = argv.slice!(i,c+1)
args.shift
m.call(*args)
end
end
subcommand = !respond_to?(:main)
argv = execute_options( argv, subcommand )
return send(:main, *argv) unless subcommand
if argv.empty?
if respond_to?(:default)
return __send__(:default)
else
$stderr << "Nothing to do."
return
end
end
subcmd = argv.shift.gsub('-','_')
subconst = subcmd.gsub(/\W/,'_').capitalize
if self.class.const_defined?(subconst)
puts "Extending self (#{self.class}) with subcommand module #{subconst}" if $debug
submod = self.class.const_get(subconst)
self.extend submod
end
argv = execute_options( argv )
if self.respond_to?( subcmd ) and not Console::Command.public_instance_methods.include?( subcmd.to_s )
puts "Calling #{subcmd}(#{argv.inspect})" if $debug
__send__(subcmd, *argv)
else
puts "Calling method_missing with #{subcmd}, #{argv.inspect}" if $debug
method_missing(subcmd, *argv)
end
end