# Path: auxlib/compat.py
# def isiterable(obj):
# 
# Path: auxlib/decorators.py
# def memoizedproperty(func):
#     """
#     Decorator to cause a method to cache it's results in self for each
#     combination of inputs and return the cached result on subsequent calls.
#     Does not support named arguments or arg values that are not hashable.
# 
#     >>> class Foo (object):
#     ...   _x = 1
#     ...   @memoizedproperty
#     ...   def foo(self):
#     ...     self._x += 1
#     ...     print('updating and returning {0}'.format(self._x))
#     ...     return self._x
#     ...
#     >>> foo1 = Foo()
#     >>> foo2 = Foo()
#     >>> foo1.foo
#     updating and returning 2
#     2
#     >>> foo1.foo
#     2
#     >>> foo2.foo
#     updating and returning 2
#     2
#     >>> foo1.foo
#     2
#     """
#     inner_attname = '__%s' % func.__name__
# 
#     def new_fget(self):
#         if not hasattr(self, '_cache_'):
#             self._cache_ = dict()
#         cache = self._cache_
#         if inner_attname not in cache:
#             cache[inner_attname] = func(self)
#         return cache[inner_attname]
# 
#     return property(new_fget)
# 
# Path: auxlib/exceptions.py
# class AuxlibError(object):
#     """Mixin to identify exceptions associated with the auxlib package."""


from collections import Mapping
from itertools import chain
from re import IGNORECASE, compile
from enum import Enum
from .compat import NoneType, integer_types, isiterable, iteritems, string_types, text_type
from .decorators import memoizedproperty
from .exceptions import AuxlibError
        >>> [boolify(x) for x in ([1], set([False]), dict({'a': 1}), tuple([2]))]
        [True, True, True, True]

    """
    # cast number types naturally
    if isinstance(value, BOOL_COERCEABLE_TYPES):
        return bool(value)
    # try to coerce string into number
    val = text_type(value).strip().lower().replace('.', '', 1)
    if val.isnumeric():
        return bool(float(val))
    elif val in BOOLISH_TRUE:
        return True
    elif nullable and val in NULL_STRINGS:
        return None
    elif val in BOOLISH_FALSE:
        return False
    else:  # must be False
        try:
            return bool(complex(val))
        except ValueError:
            if isinstance(value, string_types) and return_string:
                return value
            raise TypeCoercionError(value, "The value %r cannot be boolified." % value)


def boolify_truthy_string_ok(value):
    try:
        return boolify(value)
    except ValueError:

# Path: auxlib/compat.py
# def isiterable(obj):
# 
# Path: auxlib/decorators.py
# def memoizedproperty(func):
#     """
#     Decorator to cause a method to cache it's results in self for each
#     combination of inputs and return the cached result on subsequent calls.
#     Does not support named arguments or arg values that are not hashable.
# 
#     >>> class Foo (object):
#     ...   _x = 1
#     ...   @memoizedproperty
#     ...   def foo(self):
#     ...     self._x += 1
#     ...     print('updating and returning {0}'.format(self._x))
#     ...     return self._x
#     ...
#     >>> foo1 = Foo()
#     >>> foo2 = Foo()
#     >>> foo1.foo
#     updating and returning 2
#     2
#     >>> foo1.foo
#     2
#     >>> foo2.foo
#     updating and returning 2
#     2
#     >>> foo1.foo
#     2
#     """
#     inner_attname = '__%s' % func.__name__
# 
#     def new_fget(self):
#         if not hasattr(self, '_cache_'):
#             self._cache_ = dict()
#         cache = self._cache_
#         if inner_attname not in cache:
#             cache[inner_attname] = func(self)
#         return cache[inner_attname]
# 
#     return property(new_fget)
# 
# Path: auxlib/exceptions.py
# class AuxlibError(object):
#     """Mixin to identify exceptions associated with the auxlib package."""


# Path: auxlib/type_coercion.py
from collections import Mapping
from itertools import chain
from re import IGNORECASE, compile
from enum import Enum
from .compat import NoneType, integer_types, isiterable, iteritems, string_types, text_type
from .decorators import memoizedproperty
from .exceptions import AuxlibError

        >>> [boolify(x) for x in ([1], set([False]), dict({'a': 1}), tuple([2]))]
        [True, True, True, True]

    """
    # cast number types naturally
    if isinstance(value, BOOL_COERCEABLE_TYPES):
        return bool(value)
    # try to coerce string into number
    val = text_type(value).strip().lower().replace('.', '', 1)
    if val.isnumeric():
        return bool(float(val))
    elif val in BOOLISH_TRUE:
        return True
    elif nullable and val in NULL_STRINGS:
        return None
    elif val in BOOLISH_FALSE:
        return False
    else:  # must be False
        try:
            return bool(complex(val))
        except ValueError:
            if isinstance(value, string_types) and return_string:
                return value
            raise TypeCoercionError(value, "The value %r cannot be boolified." % value)


def boolify_truthy_string_ok(value):
    try:
        return boolify(value)
    except ValueError:

        assert isinstance(value, string_types), repr(value)