The setter follows the rules of the getter. First search
          for property variable, then logical custom getter/setter pair
          methods

def get_setter(cls, prop_name,  # @NoSelf
                   user_setter=None, setter_takes_name=False,
                   user_getter=None, getter_takes_name=False):
        """The setter follows the rules of the getter. First search
          for property variable, then logical custom getter/setter pair
          methods"""

        _inner_setter = ObservablePropertyMeta.get_setter(cls, prop_name,
                                            user_setter, setter_takes_name,
                                            user_getter, getter_takes_name)

        def _setter(self, val):
            self._prop_lock.acquire()
            _inner_setter(self, val)
            self._prop_lock.release()
        return _setter