publisher.py 1.04 KB
Newer Older
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
# coding=utf-8
class Publisher(object):
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
    """
    Base class to provide functionality to notify updates to other objects
    """
    def __init__(self):
        self.subscribers = dict()

    def subscribe(self, who, callback=None):
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        """
        Add a suscriber to the current publisher
        
        :param who: subscriber to add
        :type who: object
        :param callback: method to execute when publisher updates 
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        :type callback: callable | NoneType
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
         """
        if callback is None:
            callback = getattr(who, 'update')
        self.subscribers[who] = callback

    def unsubscribe(self, who):
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        """
        Removes a suscriber from the current publisher
        
        :param who: suscriber to remove
        :type who: object
        """
        del self.subscribers[who]

    def dispatch(self, *args):
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        """
        Notify update to all the suscribers
        
        :param args: arguments to pass
        """
        for subscriber, callback in self.subscribers.items():
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
            callback(*args)