publisher.py 1.22 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):
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        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')
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        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
        """
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        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
        """
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        for subscriber, callback in self._subscribers.items():
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
            callback(*args)
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed

    def suscribers(self, *args):
        """
        Notify update to all the suscribers

        :param args: arguments to pass
        """
        return self._subscribers.keys()