## immutable parser

In addition to the mutable parser from scopt 1.x, 2.0.0 adds an immutable parser.

    val parser = new scopt.immutable.OptionParser[Config]("scopt", "2.x") { def options = Seq(
      intOpt("f", "foo", "foo is an integer property") { (v: Int, c: Config) => c.copy(foo = v) },
      opt("o", "output", "output") { (v: String, c: Config) => c.copy(bar = v) },
      booleanOpt("xyz", "xyz is a boolean property") { (v: Boolean, c: Config) => c.copy(xyz = v) },
      keyValueOpt("l", "lib", "<libname>", "<filename>", "load library <libname>")
        { (key: String, value: String, c: Config) => c.copy(libname = key, libfile = value) },
      keyIntValueOpt(None, "max", "<libname>", "<max>", "maximum count for <libname>")
        { (key: String, value: Int, c: Config) => c.copy(maxlibname = key, maxcount = value) },
      arg("<file>", "some argument") { (v: String, c: Config) => c.copy(whatnot = v) }
    ) }
    // parser.parse returns Option[C]
    parser.parse(args, Config()) map { config =>
      // do stuff
    } getOrElse {
      // arguments are bad, usage message will have been displayed
    }

Instead of updating the config object in-place, the immutable parser expects call back functions that takes a config object and returns a new one.
