# File lib/cmdparse.rb, line 410
410:     def parse( argv = ARGV ) # :yields: level, commandName
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