code: def attribute(getter):
      
      if isfunction(getter):
          def setter(self, value):
              name = '_' + getter.__name__
              self.__change_attribute__(name=name, value=value)
  
          def new_getter(self):
              name = '_' + getter.__name__
              return getattr(self, name, None)
  
          return property(fget=new_getter, fset=setter, doc=getter.__doc__)
      else:
          raise ProgrammingError("Expected a function, got: {}".format(repr(getter)))
docs: When used as a method decorator, returns a property object
      with the method as the getter and a setter defined to call
      instance method change_attribute(), which publishes an
      AttributeChanged event.