# Path: infi/pyutils/python_compat.py
# _PYTHON_VERSION = platform.python_version()
# _IS_PYTHON_3 = _PYTHON_VERSION >= '3'
# _IS_BELOW_PYTHON_2_7 = _PYTHON_VERSION < '2.7'
# def get_underlying_function(f):
# def _get_underlying_classmethod_function(f):
#     def create_bound_method(func, self):
#     class TemporaryClass(object):


from packaging.version import Version, parse
from .python_compat import OrderedDict, itervalues
    True
    >>> x.false
    FALSE
    >>> x.false == "NOT"
    True
    >>> "NOT" in x
    True
    >>> "FALSE" in x
    True    
    """
    def __init__(self, *values, **kwargs):
        default_version = kwargs.get('default_version', ALL)
        super(Enum, self).__init__(default_version)
        self._values = OrderedDict()
        for value in values:
            if not isinstance(value, Value):
                value = Value(value)
            self._values[str(value)] = value.as_version(default_version)

    def bind_to_version(self, version):
        super(Enum, self).bind_to_version(version)
        for value in itervalues(self._values):
            value.bind_to_version(version)
            
    def _copy(self):
        return Enum(*itervalues(self._values), default_version=self._version)

    def get(self, value):
        if not self.is_bound():
            raise UnboundException("Can't lookup value for unbound versioned dict")

# Path: infi/pyutils/python_compat.py
# _PYTHON_VERSION = platform.python_version()
# _IS_PYTHON_3 = _PYTHON_VERSION >= '3'
# _IS_BELOW_PYTHON_2_7 = _PYTHON_VERSION < '2.7'
# def get_underlying_function(f):
# def _get_underlying_classmethod_function(f):
#     def create_bound_method(func, self):
#     class TemporaryClass(object):


# Path: infi/pyutils/enums.py
from packaging.version import Version, parse
from .python_compat import OrderedDict, itervalues

    True
    >>> x.false
    FALSE
    >>> x.false == "NOT"
    True
    >>> "NOT" in x
    True
    >>> "FALSE" in x
    True    
    """
    def __init__(self, *values, **kwargs):
        default_version = kwargs.get('default_version', ALL)
        super(Enum, self).__init__(default_version)
        self._values = OrderedDict()
        for value in values:
            if not isinstance(value, Value):
                value = Value(value)
            self._values[str(value)] = value.as_version(default_version)

    def bind_to_version(self, version):
        super(Enum, self).bind_to_version(version)
        for value in itervalues(self._values):
            value.bind_to_version(version)
            
    def _copy(self):
        return Enum(*itervalues(self._values), default_version=self._version)

    def get(self, value):
        if not self.is_bound():
            raise UnboundException("Can't lookup value for unbound versioned dict")

        for v in itervalues(self._values):