def parse(raw_args)
      cmd_args = cmd_args_extractor.call(raw_args)
      cmd      = root.locate(cmd_args, raw_args)
      root.add_global_options(cmd)
      begin
        parser.call(cmd, cmd_args, raw_args)
      rescue => e
        shell.error e.message
        shell.failure_exit
      end
    end
def parse(raw_args)
      cmd_args = cmd_args_extractor.call(raw_args)
      cmd      = root.locate(cmd_args, raw_args)
      root.add_global_options(cmd)
      begin
        parser.call(cmd, cmd_args, raw_args)
      rescue => e
        shell.error e.message
        shell.failure_exit
      end
    end
Initializes with a root command object

 When nothing is given we default to the script name otherwise you choose
 the name of the root command or the command itself

 Delegates all parsing responsiblities to a series of handlers, returning
 a structured hash needed to execute a command. The command being executed
 is determined by the CmdArgsStrategy unless you override it, it extracts
 all args upto the first option or ignore. The RootCommand is used to find
 the command using the extracted args, it accounts for sub commands. The
 parser Parser::ParsingStategy handles processing opts, args and ignored
 args

 @param raw_args [Array] cli args usually from ARGV
 @return [Hash] structured context for executing a command