docs: def froze_it(cls):
      """
      Decorator to prevent from creating attributes in the object ouside __init__().
  
      This decorator must be applied to the final class (doesn't work if a
      decorated class is inherited).
  
      Yoann's answer at http://stackoverflow.com/questions/3603502
      """
      cls._frozen = False
  
      def frozensetattr(self, key, value):
          if self._frozen and not hasattr(self, key):
              raise AttributeError("Attribute '{}' of class '{}' does not exist!"
                    .format(key, cls.__name__))
          else:
              object.__setattr__(self, key, value)
  
      def init_decorator(func):
          @wraps(func)
          def wrapper(self, *args, **kwargs):
              func(self, *args, **kwargs)
              self._frozen = True
          return wrapper
  
      cls.__setattr__ = frozensetattr
      cls.__init__ = init_decorator(cls.__init__)
  
      return cls