     
     public mutating func parse(_ args: ArraySlice<String>) throws {
         let fields = Mirror(reflecting: self).children.filter { $0.value is Parsable }
-        let (optionParsers, parameters) = try parseFields(fields)
+        let (options, parameters) = try parseFields(fields)
         
         var parameterValues = [String]()
-        try parse(args, optionParsers: optionParsers, parameterValues: &parameterValues)
+        try parseOptions(options, withArgs: args, parameterValues: &parameterValues)
         try parseParameters(parameters, withValues: parameterValues)
     }
     
     /// Parse fileds and return `Parser`s
-    private func parseFields(_ fields: [Mirror.Child]) throws -> ([String: Parser], [Parameter]) {
+    private func parseFields(_ fields: [Mirror.Child]) throws -> ([Option], [Parameter]) {
         var knownOptionNames = Set<String>()
         var knownParameterNames = Set<String>()
         

            try parseLongOption(characters)
        }
        try checkActiveOption()
        try optionParsers.forEach { (_, parser) in
            try parser.validate()
        }
    }

            }
        }
        
        // Check parameters default names (using filed name) and name missing error
        try parameterFields.forEach { (name, parameter) in
            checkFieldName(name, ofParameter: parameter, withKnown: &knownParameterNames)
            if parameter.name == nil {
