docs: public ICmdLineArg<?> instanceFor(final char commandPrefix, final Field p_oneField, final Arg argAnnotation)
              throws ParseException, IOException
      {
          /*
           * set the instance variables in preparation for population of arg.
           */
          resetInstanceVariables();
  
          Field oneField = null;
          /*
           * This allows for specifying args for subparsers without annotating
           * them directly.
           */
          if (!argAnnotation.variable().equals(""))
              oneField = findTheCorrectVariable(p_oneField, argAnnotation.variable().split("\\."));
          else
              oneField = p_oneField;
  
          type = ClaType.forField(oneField, argAnnotation);
  
          final Class<?> fieldType = oneField.getType();
  
          if (fieldType.isArray() || fieldType == java.util.List.class
                  || argAnnotation.multimin() > 0 || argAnnotation.multimax() > 0)
              multiple = new Integer[] {
                      (argAnnotation.multimin() == 0 ? 1 : argAnnotation.multimin()),
                      (argAnnotation.multimax() == 0 ? Integer.MAX_VALUE : argAnnotation.multimax())
              };
  
          variable = oneField.getName();
          required = argAnnotation.required();
  
          String keyword = argAnnotation.longName();
          if (keyword == null || keyword.trim().length() == 0)
              keyword = variable;
  
          camelCaps = argAnnotation.allowCamelCaps();
          metaphone = argAnnotation.allowMetaphone();
          positional = argAnnotation.positional();
          caseSensitive = argAnnotation.caseSensitive();
          defaultValue = argAnnotation.defaultValues();
          range = argAnnotation.range();
          if (!argAnnotation.matches().isEmpty())
              regx = argAnnotation.matches();
          if (argAnnotation.inList().length != 0)
              list = argAnnotation.inList();
          if (!argAnnotation.inEnum().isEmpty())
              list = convertEnumToListOfNames(oneField, argAnnotation.inEnum());
  
          help = argAnnotation.help();
          if (help.isEmpty())
              help = null;
  
          format = argAnnotation.format();
          if (format.isEmpty())
              format = null;
  
          factoryMethod = argAnnotation.factoryMethod();
          if (factoryMethod.isEmpty())
              factoryMethod = null;
          factoryArgName = argAnnotation.factoryArgName();
          if (factoryArgName.isEmpty())
              factoryArgName = null;
  
          instanceClass = argAnnotation.instanceClass();
          if (instanceClass == null || instanceClass.isEmpty())
          {
              /*
               * Setting the instanceClass allows factoryArgs that use this enum
               * to resolve to the correct class.
               */
              final Class<?> instanceType = instanceType(oneField);
              if (instanceType == fieldType && !fieldType.isEnum())
                  instanceClass = null;
              else
                  instanceClass = instanceType.getName();
          }
          final ICmdLineArg<?> arg = createArgFor(commandPrefix, argAnnotation.shortName(), keyword);
          populateArgument(arg);
          verifyArgument(arg, argAnnotation, fieldType);
          return arg;
      }