class Immutable(object):
    def __setattr__( self, name, value ):
        if hasattr( self, name ):
            raise RuntimeError(
                "Can't modify immutable object's attribute: {}".format(name)
                )

        elif name in self.__slots__:
            super().__setattr__( name, value )

        else:
            raise KeyError(
                "Can't append key \'{}\' to immutable object".format(name)
                )

    def __iter__(self):
        for name in self.__slots__:
            yield getattr(self,name)

    def __repr__(self):
        return '{}({})'.format(
            self.__class__.__name__,
            ', '.join(
                [ '{}: {}'.format( name, repr(getattr(self,name)) ) for name in self.__slots__]
                )
            )
