Mercurial > libervia-backend
diff src/tools/misc.py @ 250:ad3b820651fa
Tools: new misc library, Trigger management implementation
author | Goffi <goffi@goffi.org> |
---|---|
date | Mon, 17 Jan 2011 00:11:50 +0100 |
parents | |
children | cf005701624b |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/tools/misc.py Mon Jan 17 00:11:50 2011 +0100 @@ -0,0 +1,66 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +""" +SAT: a jabber client +Copyright (C) 2009, 2010, 2011 Jérôme Poisson (goffi@goffi.org) + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. +""" + +from logging import debug, info, error + +"""Misc usefull classes""" + +class TriggerException(Exception): + pass + +class TriggerManager: + """This class manage triggers: code which interact to change de behaviour of SàT""" + + def __init__(self): + self.__triggers={} + + def add(self, point_name, callback): + """Add a trigger to a point + @param point_name: name of the point when the trigger should be run + @param callback: method to call at the trigger point + """ + if not self.__triggers.has_key(point_name): + self.__triggers[point_name]=[] + self.__triggers[point_name].append(callback) + + def remove(self, point_name, callback): + """Remove a trigger from a point + @param point_name: name of the point when the trigger should be run + @param callback: method to remove, must exists in the trigger point""" + try: + self.__triggers[point_name].remove(callback) + except (KeyError,ValueError): + raise TriggerException("Trying to remove an unexisting trigger") + + + def point(self, point_name, *args, **kwargs): + """This put a trigger point + All the trigger for that point will be run + @param point_name: name of the trigger point + @return: True if the action must be continue, False else""" + if not self.__triggers.has_key(point_name): + return True + + for trigger in self.__triggers[point_name]: + if not trigger(*args, **kwargs): + return False + return True +