# Path: spyne/util/oset.py
# class oset(MutableSet):
#     """An ordered set implementation."""
# 
#     def __init__(self, iterable=None):
#         self.end = end = []
#         end += [None, end, end]         # sentinel node for doubly linked list
#         self.map = {}                   # key --> [key, prev, next]
#         if iterable is not None:
#             self |= iterable
# 
#     def __len__(self):
#         return len(self.map)
# 
#     def __contains__(self, key):
#         return key in self.map
# 
#     def add(self, key):
#         if key not in self.map:
#             end = self.end
#             curr = end[PREV]
#             curr[NEXT] = end[PREV] = self.map[key] = [key, curr, end]
# 
#     def extend(self, keys):
#         for key in keys:
#             if key not in self.map:
#                 end = self.end
#                 curr = end[PREV]
#                 curr[NEXT] = end[PREV] = self.map[key] = [key, curr, end]
# 
#     def discard(self, key):
#         if key in self.map:
#             key, prev, next = self.map.pop(key)
#             prev[NEXT] = next
#             next[PREV] = prev
# 
#     def __iter__(self):
#         end = self.end
#         curr = end[NEXT]
#         while curr is not end:
#             yield curr[KEY]
#             curr = curr[NEXT]
# 
#     def __reversed__(self):
#         end = self.end
#         curr = end[PREV]
#         while curr is not end:
#             yield curr[KEY]
#             curr = curr[PREV]
# 
#     def pop(self, last=True):
#         if not self:
#             raise KeyError('set is empty')
#         key = next(reversed(self)) if last else next(iter(self))
#         self.discard(key)
#         return key
# 
#     def __repr__(self):
#         if not self:
#             return '%s()' % (self.__class__.__name__,)
#         return '%s(%r)' % (self.__class__.__name__, list(self))
# 
#     def __eq__(self, other):
#         if isinstance(other, oset):
#             return len(self) == len(other) and list(self) == list(other)
#         return set(self) == set(other)
# 
#     @property
#     def back(self):
#         return self.end[1][0]


from spyne.util.oset import oset

    def add_listener(self, event_name, handler):
        """Register a handler for the given event name.

        :param event_name: The event identifier, indicated by the documentation.
                           Usually, this is a string.
        :param handler: A static python function that receives a single
                        MethodContext argument.
        """

        handlers = self.handlers.get(event_name, oset())
        handlers.add(handler)
        self.handlers[event_name] = handlers

    def del_listener(self, event_name, handler=None):
        if handler is None:
            del self.handlers[event_name]
        else:
            self.handlers[event_name].remove(handler)


    def fire_event(self, event_name, ctx, *args, **kwargs):
        """Run all the handlers for a given event name.

        :param event_name: The event identifier, indicated by the documentation.
                           Usually, this is a string.
        :param ctx: The method context. Event-related data is conventionally
                        stored in ctx.event attribute.
        """


# Path: spyne/util/oset.py
# class oset(MutableSet):
#     """An ordered set implementation."""
# 
#     def __init__(self, iterable=None):
#         self.end = end = []
#         end += [None, end, end]         # sentinel node for doubly linked list
#         self.map = {}                   # key --> [key, prev, next]
#         if iterable is not None:
#             self |= iterable
# 
#     def __len__(self):
#         return len(self.map)
# 
#     def __contains__(self, key):
#         return key in self.map
# 
#     def add(self, key):
#         if key not in self.map:
#             end = self.end
#             curr = end[PREV]
#             curr[NEXT] = end[PREV] = self.map[key] = [key, curr, end]
# 
#     def extend(self, keys):
#         for key in keys:
#             if key not in self.map:
#                 end = self.end
#                 curr = end[PREV]
#                 curr[NEXT] = end[PREV] = self.map[key] = [key, curr, end]
# 
#     def discard(self, key):
#         if key in self.map:
#             key, prev, next = self.map.pop(key)
#             prev[NEXT] = next
#             next[PREV] = prev
# 
#     def __iter__(self):
#         end = self.end
#         curr = end[NEXT]
#         while curr is not end:
#             yield curr[KEY]
#             curr = curr[NEXT]
# 
#     def __reversed__(self):
#         end = self.end
#         curr = end[PREV]
#         while curr is not end:
#             yield curr[KEY]
#             curr = curr[PREV]
# 
#     def pop(self, last=True):
#         if not self:
#             raise KeyError('set is empty')
#         key = next(reversed(self)) if last else next(iter(self))
#         self.discard(key)
#         return key
# 
#     def __repr__(self):
#         if not self:
#             return '%s()' % (self.__class__.__name__,)
#         return '%s(%r)' % (self.__class__.__name__, list(self))
# 
#     def __eq__(self, other):
#         if isinstance(other, oset):
#             return len(self) == len(other) and list(self) == list(other)
#         return set(self) == set(other)
# 
#     @property
#     def back(self):
#         return self.end[1][0]


# Path: spyne/evmgr.py
from spyne.util.oset import oset


    def add_listener(self, event_name, handler):
        """Register a handler for the given event name.

        :param event_name: The event identifier, indicated by the documentation.
                           Usually, this is a string.
        :param handler: A static python function that receives a single
                        MethodContext argument.
        """

        handlers = self.handlers.get(event_name, oset())
        handlers.add(handler)
        self.handlers[event_name] = handlers

    def del_listener(self, event_name, handler=None):
        if handler is None:
            del self.handlers[event_name]
        else:
            self.handlers[event_name].remove(handler)


    def fire_event(self, event_name, ctx, *args, **kwargs):
        """Run all the handlers for a given event name.

        :param event_name: The event identifier, indicated by the documentation.
                           Usually, this is a string.
        :param ctx: The method context. Event-related data is conventionally
                        stored in ctx.event attribute.
        """


        handlers = self.handlers.get(event_name, oset())