code: def add_property(cls, name, default=None, getter=None, setter=None):
      """
      Add a property accessible through self.{name} with underlying variable self._{name}.
      Optionally setup a setter as well.
      """
  
      if hasattr(cls, name):
          raise ValueError(
              f"Property by the name of {name} already exists in {cls}. Maybe you want to find another name?"
          )
  
      setattr(cls, f"_{name}", default)
      if getter is None:
          getter = lambda self: getattr(self, f"_{name}")
      if setter is None:
          setter = lambda self, value: _readonly_setter(self, name)
  
      setattr(cls, name, property(getter, setter))
  
label_desc: Use image node_id 1 for calling the StanzaObject obj's underlying member method code with example usage: obj.add_property(cls, name, default, getter, setter) without return types