docs: def validate(glob, *arg_checks):
      """
      Function for validating group of arguments ; each argument is represented as
       a 4-tuple like follows:
  
          (argument_name, fail_condition, error_message, default)
  
          - argument_name: the name of the argument like entered in add_argument()
          - fail_condition: condition in Python code with the argument name
                            replaced by ' ? ' (e.g. " ? > 0")
          - error_message: message describing what failed with the validation ofs
                           the current argument
          - default [optional]: value to be given if the validation fails ; this
                                implies that the script will not exit after the
                                validation (if no other blocking argument present)
  
      :param glob:       globals() instance from the calling script
      :param arg_checks: list of 3/4-tuples
      """
      locals().update(glob)  # allows to import user-defined objects from glob
                             #  into the local scope
      if glob['args'] is None or glob['logger'] is None:
          return
      exit_app = False
      for check in arg_checks:
          check = check + (None, ) * (4 - len(check))
          param, condition, message, default = check
          if re.match(r'^_?[a-zA-Z][a-zA-Z0-9_]*$', param) is None:
              raise ValueError("Illegal argument name")
          try:
              result = eval(condition.replace(" ? ", " glob['args'].{} "
                                              .format(param)))
          except Exception as e:
              result = True
              message = str(e)
          if result:
              if default is None:
                  glob['logger'].error(message or "Validation failed")
                  exit_app = True
              else:
                  glob['logger'].warning(message or "Validation failed")
                  setattr(glob['args'], param, default)
      if exit_app:
          sys.exit(2)