def iterable(value,
             allow_empty = False,
             forbid_literals = (str, bytes),
             minimum_length = None,
             maximum_length = None,
             **kwargs):
    """Validate that ``value`` is a valid iterable.

    :param value: The value to validate.

    :param allow_empty: If ``True``, returns :obj:`None <python:None>` if ``value``
      is empty. If ``False``, raises a
      :class:`EmptyValueError <validator_collection.errors.EmptyValueError>` if
      ``value`` is empty. Defaults to ``False``.
    :type allow_empty: :class:`bool <python:bool>`

    :param forbid_literals: A collection of literals that will be considered invalid
      even if they are (actually) iterable. Defaults to :class:`str <python:str>` and
      :class:`bytes <python:bytes>`.
    :type forbid_literals: iterable

    :param minimum_length: If supplied, indicates the minimum number of members
      needed to be valid.
    :type minimum_length: :class:`int <python:int>`

    :param maximum_length: If supplied, indicates the minimum number of members
      needed to be valid.
    :type maximum_length: :class:`int <python:int>`

    :returns: ``value`` / :obj:`None <python:None>`
    :rtype: iterable / :obj:`None <python:None>`

    :raises EmptyValueError: if ``value`` is empty and ``allow_empty`` is ``False``
    :raises NotAnIterableError: if ``value`` is not a valid iterable or
      :obj:`None <python:None>`
    :raises MinimumLengthError: if ``minimum_length`` is supplied and the length of
      ``value`` is less than ``minimum_length`` and ``whitespace_padding`` is
      ``False``
    :raises MaximumLengthError: if ``maximum_length`` is supplied and the length of
      ``value`` is more than the ``maximum_length``
    """
    if not value and not allow_empty:
        raise errors.EmptyValueError('value (%s) was empty' % value)
    elif value is None:
        return None

    minimum_length = integer(minimum_length, allow_empty = True, force_run = True) # pylint: disable=E1123
    maximum_length = integer(maximum_length, allow_empty = True, force_run = True) # pylint: disable=E1123

    if isinstance(value, forbid_literals) or not hasattr(value, '__iter__'):
        raise errors.NotAnIterableError('value type (%s) not iterable' % type(value))

    if value and minimum_length is not None and len(value) < minimum_length:
        raise errors.MinimumLengthError(
            'value has fewer items than the minimum length %s' % minimum_length
        )

    if value and maximum_length is not None and len(value) > maximum_length:
        raise errors.MaximumLengthError(
            'value has more items than the maximum length %s' % maximum_length
        )

    return value
Validate that ``value`` is a valid iterable.

    :param value: The value to validate.

    :param allow_empty: If ``True``, returns :obj:`None <python:None>` if ``value``
      is empty. If ``False``, raises a
      :class:`EmptyValueError <validator_collection.errors.EmptyValueError>` if
      ``value`` is empty. Defaults to ``False``.
    :type allow_empty: :class:`bool <python:bool>`

    :param forbid_literals: A collection of literals that will be considered invalid
      even if they are (actually) iterable. Defaults to :class:`str <python:str>` and
      :class:`bytes <python:bytes>`.
    :type forbid_literals: iterable

    :param minimum_length: If supplied, indicates the minimum number of members
      needed to be valid.
    :type minimum_length: :class:`int <python:int>`

    :param maximum_length: If supplied, indicates the minimum number of members
      needed to be valid.
    :type maximum_length: :class:`int <python:int>`

    :returns: ``value`` / :obj:`None <python:None>`
    :rtype: iterable / :obj:`None <python:None>`

    :raises EmptyValueError: if ``value`` is empty and ``allow_empty`` is ``False``
    :raises NotAnIterableError: if ``value`` is not a valid iterable or
      :obj:`None <python:None>`
    :raises MinimumLengthError: if ``minimum_length`` is supplied and the length of
      ``value`` is less than ``minimum_length`` and ``whitespace_padding`` is
      ``False``
    :raises MaximumLengthError: if ``maximum_length`` is supplied and the length of
      ``value`` is more than the ``maximum_length``