During the initial transient state, getattribute works on params; as soon as a non-param is
    requested, all checks are forced and the getattr switches to standard transient form.

def _imm_init_getattribute(self, name):
    '''
    During the initial transient state, getattribute works on params; as soon as a non-param is
    requested, all checks are forced and the getattr switches to standard transient form.
    '''
    values = _imm_value_data(self)
    params = _imm_param_data(self)
    if name in values:
        _imm_init_to_trans(self)
        return getattr(self, name)
    elif name in params:
        dd = object.__getattribute__(self, '__dict__')
        if name in dd: return dd[name]
        else: raise RuntimeError('Required immutable parameter %s requested before set' % name)
    else:
        # if they request a required param before it's set, raise an exception; that's fine
        return object.__getattribute__(self, name)