+# -*- coding: utf-8 -*-
+"""
+Décorateur, métaclasse et classe mixin pour faciliter
+l'implémentation des gestionnaires d'événements pygame.
+
+Utilisation :
+- hériter de EventHandlerMixin
+- décorer les méthodes gestionnaires d'événements avec le décorateur 'event_handler'
+ en passant en paramètre le code d'événement pygame
+
+Il n'existe aucune contrainte sur le nommage de la méthode décorée.
+La méthode gestionnaire d'événement reçoit l'événement pygame comme unique paramètre.
+
+par exemple :
+
+import pygame
+class Machin(pygame.sprite.Sprite, EventHandlerMixin) :
+
+ # .../...
+
+ @event_handler(pygame.KEYDOWN)
+ def handleKeyDown(self, event) :
+ pass
+
+
+$Id$
+$URL$
+"""
+import types
+
+def event_handler(eventType) :
+ def doRename(m) :
+ m.__name__ = 'eventHandler%s' % eventType
+ return m
+ return doRename
+
+
+class MetaRenamer(type):
+ def __new__(mcs, name, bases, dict) :
+ for k, v in dict.items() :
+ if isinstance(v, types.FunctionType) :
+ if k != v.__name__ :
+ print 'renommage de %s en %s' % (k, v.__name__)
+ dict[v.__name__] = v
+ del dict[k]
+ return type.__new__(mcs, name, bases, dict)
+
+
+class EventHandlerMixin(object) :
+ __metaclass__ = MetaRenamer
+
+ def input(self, event) :
+ handler = getattr(self, 'eventHandler%s' % event.type, lambda e:None)
+ handler(event)