immutable_types = set((int, str))
class Frozen(object):
def __init__(self, value):
self._value = value
def __getattribute__(self, name):
if name == '_value': return super(Frozen, self).__getattribute__(name)
v = getattr(self._value, name)
return v if v.__class__ in immutable_types else freeze(v)
def __setattr__(self, name, value):
if name == '_value': super(Frozen, self).__setattr__(name, value)
else: raise Exception("Can't modify frozen object {0}".format(self._value))
def freeze(value):
return Frozen(value)