docs: def _imm_trans_setattr(self, name, value):
      '''
      An immutable's transient setattr allows params to be set, and runs checks as they are.
      '''
      params = _imm_param_data(self)
      dd = object.__getattribute__(self, '__dict__')
      if name in params:
          (_, tx_fn, arg_lists, check_fns, deps) = params[name]
          value = value if tx_fn is None else tx_fn(value)
          old_deps = {}
          orig_value = dd[name]
          # clear the dependencies before we run the checks; save them in case the checks fail and we
          # go back to how things were...
          for dep in deps:
              if dep in dd:
                  old_deps[dep] = dd[dep]
                  del dd[dep]
          try:
              dd[name] = value
              for (args, check_fn) in zip(arg_lists, check_fns):
                  if not check_fn(*[getattr(self, arg) for arg in args]):
                      raise RuntimeError(
                          ('Changing value of immutable attribute \'%s\'' +
                           ' caused validation failure: %s') % (name, (args, check_fn)))
              # if all the checks ran, we don't return the old deps; they are now invalid
              old_deps = None
          finally:
              if old_deps:
                  # in this case, something didn't check-out, so we return the old deps and let the
                  # exception ride; we also return the original value of the edited param
                  for (dep,val) in six.iteritems(old_deps):
                      dd[dep] = val
                  dd[name] = orig_value
      else:
          raise TypeError(
              'Attempt to change non-parameter member \'%s\' of transient immutable' % name)