anchor.diff:  starting with `0x`, `0X` or `#` are interpreted as hexadecimal numbers, numbers starting with `0` are interpreted
   as octal numbers, and otherwise the number is interpreted as a decimal number.
   
  -Java 8-style lambdas:
  -[source,java]
  +.Java 8
  +[source,java,role="primary"]
   ----
   new CommandLine(obj)
  -        .registerConverter(Byte.class,    s -> Byte::decode)
  -        .registerConverter(Byte.TYPE,     s -> Byte::decode)
  -        .registerConverter(Short.class,   s -> Short::decode)
  -        .registerConverter(Short.TYPE,    s -> Short::decode)
  -        .registerConverter(Integer.class, s -> Integer::decode)
  -        .registerConverter(Integer.TYPE,  s -> Integer::decode)
  -        .registerConverter(Long.class,    s -> Long::decode)
  -        .registerConverter(Long.TYPE,     s -> Long::decode);
  -----
  -
  -In Java 5:
  -[source,java]
  +        .registerConverter(Byte.class,    Byte::decode)
  +        .registerConverter(Byte.TYPE,     Byte::decode)
  +        .registerConverter(Short.class,   Short::decode)
  +        .registerConverter(Short.TYPE,    Short::decode)
  +        .registerConverter(Integer.class, Integer::decode)
  +        .registerConverter(Integer.TYPE,  Integer::decode)
  +        .registerConverter(Long.class,    Long::decode)
  +        .registerConverter(Long.TYPE,     Long::decode);
  +----
  +
  +.Kotlin
  +[source,kotlin,role="secondary"]
  +----
  +CommandLine(obj)
  +        .registerConverter(Byte::class.java,     java.lang.Byte::decode)
  +        .registerConverter(java.lang.Byte.TYPE,  java.lang.Byte::decode)
  +        .registerConverter(Short::class.java,    java.lang.Short::decode)
  +        .registerConverter(java.lang.Short.TYPE, java.lang.Short::decode)
  +        .registerConverter(Int::class.java,      Integer::decode)
  +        .registerConverter(Integer.TYPE,         Integer::decode)
  +        .registerConverter(Long::class.java,     java.lang.Long::decode)
  +        .registerConverter(java.lang.Long.TYPE,  java.lang.Long::decode)
  +----
  +
  +.Java 5
  +[source,java,role="primary"]
   ----
   ITypeConverter<Integer> intConverter = new ITypeConverter<Integer>() {
       public Integer convert(String s) {
  
positive.code: 
  === Custom Factory
  
  Declaratively registered <<Registering Subcommands Declaratively,subcommands>>, <<Option-specific Type Converters,type converters>> and <<Dynamic Version Information,version providers>> must be instantiated somehow. From picocli 2.2, a custom factory can be specified when constructing a `CommandLine` instance. This allows full control over object creation and opens possibilities for Inversion of Control and Dependency Injection (see <<Dependency Injection,next section>>). For example:
  
  [source,java]
  ----
  IFactory myFactory = getCustomFactory();
  CommandLine cmdLine = new CommandLine(new Git(), myFactory);
  ----
  
  Custom factories need to implement the `picocli.CommandLine.IFactory` interface:
  
negative.code: assert optionArg.file.equals("output.txt");
  ----
  
  .Kotlin
  [source,kotlin,role="secondary"]
  ----
  val optionArg = OptionArg()
  val commandLine = CommandLine(optionArg)
  
  commandLine.separator = ":" // programmatically set a separator
  commandLine.parseArgs("-f:output.txt")
  assertEquals("output.txt", optionArg.file)
  ----
  
  
  === Best Practices for Command Line Interfaces
  
  