Package libxyz :: Package core :: Module hookmanager |
[hide private]
[frames] | no frames]

# Source Code for Module libxyz.core.hookmanager

     1  #-*- coding: utf8 -*
     2  #
     3  # Max E. Kuznecov ~syhpoon <mek@mek.uz.ua> 2008
     4  #
     5
     6  # This file is part of XYZCommander.
     7  # XYZCommander is free software: you can redistribute it and/or modify
     8  # it under the terms of the GNU Lesser Public License as published by
     9  # the Free Software Foundation, either version 3 of the License, or
    10  # (at your option) any later version.
    11  # XYZCommander is distributed in the hope that it will be useful,
    12  # but WITHOUT ANY WARRANTY; without even the implied warranty of
    13  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    14  # GNU Lesser Public License for more details.
    15  # You should have received a copy of the GNU Lesser Public License
    16  # along with XYZCommander. If not, see <http://www.gnu.org/licenses/>.
    17
    18  import traceback
    19
    20  from libxyz.core.utils import ustring
    21
    22 -class HookManager(object):
    23      """
    24      Hooks dispatcher
    25      """
    26
    27 -    def __init__(self):
    28          self._data = {}
    29
    30      #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    31
    32 -    def register(self, event, proc):
    33          """
    34          Register proc to be run upon event occured
    35          """
    36
    37          if event not in self._data:
    38              self._data[event] = []
    39
    40          if not callable(proc):
    41              xyzlog.error(_(u"HookManager: Callable argument expected"))
    42              return False
    43
    44          self._data[event].append(proc)
    45
    46          return True
    47
    48      #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    49
    50 -    def clear(self, event):
    51          """
    52          Clear all data assosiated with an event
    53          """
    54
    55          self._data[event] = []
    56
    57      #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    58
    59 -    def dispatch(self, event, *args):
    60          """
    61          Sequentially run procedures registered with provided event
    62          """
    63
    64          # No callbacks registered
    65          if event not in self._data or not self._data[event]:
    66              return False
    67
    68          for proc in self._data[event]:
    69              try:
    70                  proc(*args)
    71              except Exception, e:
    72                  xyzlog.error(
    73                      _(u"Error running callback procedure for event %s") %
    74                      ustring(str(e)))
    75
    76                  xyzlog.debug(ustring(traceback.format_exc()))
    77
    78                  return False
    79
    80          return True
    81