A specialization of the Properties map type with the added
abilities to read application options from the command line and to
use bean patterns to set an object's properties via command-line the
stored mappings.
A typical use pattern for this class is to construct a new instance
in the main method, then call setFromCmdLine(java.lang.String[]) with the
given args. Next, an instanceof the class being invoked is created, and
setInto(java.lang.Object) is called with that instance as a parameter. With this
pattern, the user can configure any bean properties of the class, or even
properties of classes reachable from the class, through the command line.

removeProperty(String key,
String key2,
String def)
Specialization of Properties#removeProperty to allow
a value to appear under either of two keys; useful for short and
long versions of command-line flags.

setFromCmdLine

Parses the given argument list into flag/value pairs, which are stored
as properties. Flags that are present without values are given
the value "true". If any flag is found for which there is already
a mapping present, the existing mapping will be overwritten.
Flags should be of the form:java Foo -flag1 value1 -flag2 value2 ... arg1 arg2 ...

Parameters:

args - the command-line arguments

Returns:

all arguments in the original array beyond the
flag/value pair list

setInto

This method uses reflection to set all the properties in the given
object that are named by the keys in this map. For a given key 'foo',
the algorithm will look for a 'setFoo' method in the given instance.
For a given key 'foo.bar', the algorithm will first look for a
'getFoo' method in the given instance, then will recurse on the return
value of that method, now looking for the 'bar' property. This allows
the setting of nested object properties. If in the above example the
'getFoo' method is not present or returns null, the algorithm will
look for a 'setFoo' method; if found it will constrct a new instance
of the correct type, set it using the 'setFoo' method, then recurse on
it as above. Property names can be nested in this way to an arbitrary
depth. For setter methods that take multiple parameters, the value
mapped to the key can use the ',' as an argument separator character.
If not enough values are present for a given method after splitting
the string on ',', the remaining arguments will receive default
values. All arguments are converted from string form to the
correct type if possible(i.e. if the type is primitive,
java.lang.Clas, or has a constructor that takes a single string
argument). Examples: