The @require decorator, usable in an immutable class (see immutable), specifies that the
    following function is actually a validation check on the immutable class. These functions
    will appear as static members of the class and get called automatically when the relevant
    data change. Daughter classes can overload requirements to change them, or may add new
    requirements with different function names.

def require(f):
    '''
    The @require decorator, usable in an immutable class (see immutable), specifies that the
    following function is actually a validation check on the immutable class. These functions
    will appear as static members of the class and get called automatically when the relevant
    data change. Daughter classes can overload requirements to change them, or may add new
    requirements with different function names.
    '''
    (args, varargs, kwargs, dflts) = getargspec_py27like(f)
    if varargs is not None or kwargs is not None or dflts:
        raise ValueError(
            'Requirements may not accept variable, variadic keyword, or default arguments')
    f._pimms_immutable_data_ = {}
    f._pimms_immutable_data_['is_check'] = True
    f._pimms_immutable_data_['inputs'] = args
    f._pimms_immutable_data_['name'] = f.__name__
    f = staticmethod(f)
    return f