gajim-plural/src/common/xmpp/plugin.py

98 lines
3.1 KiB
Python
Raw Normal View History

## plugin.py
2005-04-26 20:45:54 +02:00
##
## Copyright (C) 2003-2005 Alexey "Snake" Nezhdanov
##
## 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 2, 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.
2006-01-18 21:46:29 +01:00
# $Id: client.py,v 1.52 2006/01/02 19:40:55 normanr Exp $
2005-04-26 20:45:54 +02:00
'''
2005-04-26 20:45:54 +02:00
Provides PlugIn class functionality to develop extentions for xmpppy.
'''
2005-04-26 20:45:54 +02:00
import logging
log = logging.getLogger('gajim.c.x.plugin')
2005-04-26 20:45:54 +02:00
class PlugIn:
'''
2009-06-15 21:00:14 +02:00
Abstract xmpppy plugin infrastructure code, providing plugging in/out and
debugging functionality.
Inherit to develop pluggable objects. No code change on the owner class
required (the object where we plug into)
2009-06-15 21:00:14 +02:00
For every instance of PlugIn class the 'owner' is the class in what the plug
was plugged.
'''
def __init__(self):
self._exported_methods=[]
def PlugIn(self, owner):
'''
Attach to owner and register ourself and our _exported_methods in it.
2009-06-15 21:00:14 +02:00
If defined by a subclass, call self.plugin(owner) to execute hook
code after plugging.
'''
self._owner=owner
log.info('Plugging %s __INTO__ %s' % (self, self._owner))
2008-12-15 22:06:08 +01:00
if self.__class__.__name__ in owner.__dict__:
log.debug('Plugging ignored: another instance already plugged.')
return
self._old_owners_methods=[]
for method in self._exported_methods:
2008-12-15 22:06:08 +01:00
if method.__name__ in owner.__dict__:
self._old_owners_methods.append(owner.__dict__[method.__name__])
owner.__dict__[method.__name__]=method
if self.__class__.__name__.endswith('Dispatcher'):
2008-12-15 22:06:08 +01:00
# FIXME: I need BOSHDispatcher or XMPPDispatcher on .Dispatcher
# there must be a better way..
owner.__dict__['Dispatcher']=self
else:
owner.__dict__[self.__class__.__name__]=self
2009-06-15 21:00:14 +02:00
# Execute hook
if hasattr(self,'plugin'):
return self.plugin(owner)
2008-12-15 22:06:08 +01:00
def PlugOut(self):
'''
Unregister our _exported_methods from owner and detach from it.
If defined by a subclass, call self.plugout() after unplugging to execute
hook code.
'''
2008-12-15 22:06:08 +01:00
log.info('Plugging %s __OUT__ of %s.' % (self, self._owner))
for method in self._exported_methods:
del self._owner.__dict__[method.__name__]
for method in self._old_owners_methods:
self._owner.__dict__[method.__name__]=method
# FIXME: Dispatcher workaround
if self.__class__.__name__.endswith('Dispatcher'):
del self._owner.__dict__['Dispatcher']
else:
del self._owner.__dict__[self.__class__.__name__]
# Execute hook
if hasattr(self,'plugout'):
return self.plugout()
del self._owner
2009-06-15 21:00:14 +02:00
@classmethod
def get_instance(cls, *args, **kwargs):
'''
Factory Method for object creation.
2009-06-15 21:00:14 +02:00
Use this instead of directly initializing the class in order to make
unit testing easier. For testing, this method can be patched to inject
mock objects.
'''
return cls(*args, **kwargs)
# vim: se ts=3: