1) Reimplement getopt_long.
   key behaviour:
   a) show argc and argv into a vector, skipping the program name.
   b) wihle size() > 1 in the vector, process.
   c) if the return code is FAILED, abort.
      if the return code is OK, remove the head and continue.
      if the return code is STOP, return.

process()
  if in an option, use option.process()
  if not in an option,
    if the string starts with -, try to identify an option.
      if no option, FAIL.
      if an option, call option.process()
    else call nonoption.process()
