410: def parse( argv = ARGV )
411: level = 0
412: command = @main_command
413:
414: while !command.nil?
415: argv = if command.has_commands? || ENV.include?( 'POSIXLY_CORRECT' )
416: command.options.order( argv )
417: else
418: command.options.permute( argv )
419: end
420: yield( level, command.name ) if block_given?
421:
422: if command.has_commands?
423: cmdName, argv = argv[0], argv[1..-1] || []
424:
425: if cmdName.nil?
426: if command.default_command.nil?
427: raise NoCommandGivenError
428: else
429: cmdName = command.default_command
430: end
431: else
432: raise InvalidCommandError.new( cmdName ) unless command.commands[ cmdName ]
433: end
434:
435: command = command.commands[cmdName]
436: level += 1
437: else
438: command.execute( argv )
439: command = nil
440: end
441: end
442: rescue ParseError, OptionParser::ParseError => e
443: raise if !@handle_exceptions
444: puts "Error while parsing command line:\n " + e.message
445: puts
446: @main_command.commands['help'].execute( command.super_commands.reverse.collect {|c| c.name} ) if @main_command.commands['help']
447: exit
448: end