:type name str
    :type value_type Type
    :type item_help str
    :type default Type
    :rtype ModuleArgumentsBuilder

def add_argument(self, name, value_type, item_help, default=None):
    """
    :type name str
    :type value_type Type
    :type item_help str
    :type default Type
    :rtype ModuleArgumentsBuilder
    """
    if value_type and value_type not in self.__restricted_types:
      raise ArgumentException("Named argument couldn't have {} type".format(value_type.__name__))

    if default is not None and not isinstance(default, value_type):
      raise ArgumentException("Invalid default type for argument".format(name))

    if value_type is bool and default is None:
      default = False

    self._args.update({
      name: ModuleArgumentItem(name, value_type, item_help, default)
    })
    return self