docs: 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)