<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 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