def __init(self): self.__listeners = WeakMethodList() self.__remove_listeners = WeakMethodList() # number of event calls # if any event is triggered increase the number, after all callbacks are executed decrease it # if it reaches 0 it means that in the current object all event callbacks were executed self.__event_call_number = 0 self.__hard_remove = True
class ChangeListener(object): """Trivial ChangeListener. The object that changes and the object that listens have to inherit from this class. An object calls _changed everytime something has changed, obviously. This function calls every Callback, that has been registered to listen for a change. NOTE: ChangeListeners aren't saved, they have to be reregistered on load NOTE: RemoveListeners must not access the object, as it is in progress of being destroyed. """ def __init__(self, *args, **kwargs): super(ChangeListener, self).__init__() self.__init() def __init(self): self.__listeners = WeakMethodList() self.__remove_listeners = WeakMethodList() # number of event calls # if any event is triggered increase the number, after all callbacks are executed decrease it # if it reaches 0 it means that in the current object all event callbacks were executed self.__event_call_number = 0 self.__hard_remove = True def __remove_listener(self, listener_list, listener): # check if the listener should be hard removed # if so switch it in the list to None try: if self.__hard_remove: listener_list.remove(listener) else: listener_list[listener_list.index(listener)] = None except ValueError as e: # nicer error: raise ValueError( str(e) + "\nTried to remove: " + str(listener) + "\nat " + str(self) + "\nList: " + str([str(i) for i in listener_list]) ) def __call_listeners(self, listener_list): # instead of removing from list, switch the listener in position to None # this way, iteration won't be affected while listeners may modify the list self.__hard_remove = False # increase the event call number self.__event_call_number += 1 for listener in listener_list: if listener: try: listener() except ReferenceError as e: # listener object is dead, don't crash since it doesn't need updates now anyway print "Warning: the dead are listening to", self, ": ", e import traceback traceback.print_stack() self.__event_call_number -= 1 if self.__event_call_number == 0: self.__hard_remove = True listener_list[:] = [l for l in listener_list if l] ## Normal change listener def add_change_listener(self, listener, call_listener_now=False, no_duplicates=False): assert callable(listener) if not no_duplicates or listener not in self.__listeners: self.__listeners.append(listener) if call_listener_now: # also call if duplicate is adde listener() def remove_change_listener(self, listener): self.__remove_listener(self.__listeners, listener) def has_change_listener(self, listener): return listener in self.__listeners def discard_change_listener(self, listener): """Remove listener if it's there""" if self.has_change_listener(listener): self.remove_change_listener(listener) def clear_change_listeners(self): """Removes all change listeners""" self.__listeners = WeakMethodList() def _changed(self): """Calls every listener when an object changed""" self.__call_listeners(self.__listeners) ## Removal change listener def add_remove_listener(self, listener, no_duplicates=False): """A listener that listens for removal of the object""" assert callable(listener) if no_duplicates and listener in self.__remove_listeners: return # don't allow duplicate entries self.__remove_listeners.append(listener) def remove_remove_listener(self, listener): self.__remove_listener(self.__remove_listeners, listener) def has_remove_listener(self, listener): return listener in self.__remove_listeners def discard_remove_listener(self, listener): if self.has_remove_listener(listener): self.remove_remove_listener(listener) def load(self, db, world_id): self.__init() def remove(self): self.__call_listeners(self.__remove_listeners) self.end() def end(self): self.__listeners = None self.__remove_listeners = None
class ChangeListener(object): """Trivial ChangeListener. The object that changes and the object that listens have to inherit from this class. An object calls _changed everytime something has changed, obviously. This function calls every Callback, that has been registered to listen for a change. NOTE: ChangeListeners aren't saved, they have to be reregistered on load NOTE: Removelisteners must not access the object, as it is in progress of being destroyed. """ def __init__(self, *args, **kwargs): super(ChangeListener, self).__init__() self.__init() def __init(self): self.__listeners = WeakMethodList() self.__remove_listeners = WeakMethodList() # number of event calls # if any event is triggered increase the number, after all callbacks are executed decrease it # if it reaches 0 it means that in the current object all event callbacks were executed self.__event_call_number = 0 self.__hard_remove = True def __remove_listener(self, listener_list, listener): # check if the listener should be hard removed # if so switch it in the list to None if self.__hard_remove: listener_list.remove(listener) else: listener_list[listener_list.index(listener)] = None def __call_listeners(self, listener_list): # instead of removing from list, switch the listener in position to None # this way, iteration won't be affected while listeners may modify the list self.__hard_remove = False # increase the event call number self.__event_call_number += 1 for listener in listener_list: if listener: listener() self.__event_call_number -= 1 if self.__event_call_number == 0: self.__hard_remove = True listener_list = [ l for l in listener_list if l ] ## Normal change listener def add_change_listener(self, listener, call_listener_now = False): assert callable(listener) self.__listeners.append(listener) if call_listener_now: listener() def remove_change_listener(self, listener): self.__remove_listener(self.__listeners, listener) def has_change_listener(self, listener): return (listener in self.__listeners) def discard_change_listener(self, listener): """Remove listener if it's there""" if self.has_change_listener(listener): self.remove_change_listener(listener) def clear_change_listeners(self): """Removes all change listeners""" self.__listeners = WeakMethodList() def _changed(self): """Calls every listener when an object changed""" self.__call_listeners(self.__listeners) ## Removal change listener def add_remove_listener(self, listener): """A listener that listens for removal of the object""" assert callable(listener) self.__remove_listeners.append(listener) def remove_remove_listener(self, listener): self.__remove_listener(self.__remove_listeners, listener) def has_remove_listener(self, listener): return (listener in self.__remove_listeners) def load(self, db, world_id): self.__init() def remove(self): self.__call_listeners(self.__remove_listeners) self.end() def end(self): self.__listeners = None self.__remove_listeners = None
def clear_change_listeners(self): """Removes all change listeners""" self.__listeners = WeakMethodList()
def __init(self): self.__listeners = WeakMethodList() self.__remove_listeners = WeakMethodList()
class ChangeListener(object): """Trivial ChangeListener. The object that changes and the object that listens have to inherit from this class. An object calls _changed everytime something has changed, obviously. This function calls every Callback, that has been registered to listen for a change. NOTE: ChangeListeners aren't saved, they have to be reregistered on load NOTE: Removelisteners must not access the object, as it is in progress of being destroyed. """ def __init__(self, *args, **kwargs): super(ChangeListener, self).__init__() self.__init() def __init(self): self.__listeners = WeakMethodList() self.__remove_listeners = WeakMethodList() ## Normal change listener def add_change_listener(self, listener, call_listener_now=False): assert callable(listener) self.__listeners.append(listener) if call_listener_now: listener() def remove_change_listener(self, listener): self.__listeners.remove(listener) def has_change_listener(self, listener): return (listener in self.__listeners) def discard_change_listener(self, listener): """Remove listener if it's there""" if self.has_change_listener(listener): self.remove_change_listener(listener) def clear_change_listeners(self): """Removes all change listeners""" self.__listeners = WeakMethodList() def _changed(self): """Calls every listener when an object changed""" for listener in self.__listeners: listener() ## Removal change listener def add_remove_listener(self, listener): """A listener that listens for removal of the object""" assert callable(listener) self.__remove_listeners.append(listener) def remove_remove_listener(self, listener): self.__remove_listeners.remove(listener) def has_remove_listener(self, listener): return (listener in self.__remove_listeners) def load(self, db, world_id): self.__init() def remove(self): for listener in self.__remove_listeners: listener() self.end() def end(self): self.__listeners = None self.__remove_listeners = None
class Changelistener(object): """Trivial ChangeListener. The object that changes and the object that listens have to inherit from this class. An object calls _changed everytime something has changed, obviously. This function calls every Callback, that has been registered to listen for a change. NOTE: Changelisteners aren't saved, they have to be reregistered on load NOTE: Removelisteners must not access the object. """ def __init__(self, *args, **kwargs): super(Changelistener, self).__init__() self.__init() def __init(self): self.__listeners = WeakMethodList() self.__remove_listeners = WeakMethodList() ## Normal change listener def add_change_listener(self, listener, call_listener_now = False): self.__listeners.append(listener) if call_listener_now: listener() def remove_change_listener(self, listener): self.__listeners.remove(listener) def has_change_listener(self, listener): return (listener in self.__listeners) def discard_change_listener(self, listener): """Remove listener if it's there""" if self.has_change_listener(listener): self.remove_change_listener(listener) def clear_change_listeners(self): """Removes all change listeners""" self.__listeners = WeakMethodList() def _changed(self): """Calls every listener when an object changed""" for listener in self.__listeners: listener() ## Removal change listener def add_remove_listener(self, listener): """A listener that listens for removal of the object""" self.__remove_listeners.append(listener) def remove_remove_listener(self, listener): self.__remove_listeners.remove(listener) def has_remove_listener(self, listener): return (listener in self.__remove_listeners) def load(self, db, world_id): self.__init() def remove(self): for listener in self.__remove_listeners: listener() self.end() def end(self): self.__listeners = None self.__remove_listeners = None