# vPresent is an immersive presentation creation and display application.
# Copyright (C) 2007-2008 by Infiscape Corporation
#
# 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 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, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

# mixins

# Implementation of singleton and borg patterns.
# both of these support derivation.
#
# The difference is that Singleton returns the same instance each time
# so the instances test == to each other.
#
# Borg creates new instances that just share state
#

class Singleton(object):
   """ Note, the init method will be called multiple times. """
   def __new__(ctype):
      if not '_the_instance' in ctype.__dict__:
         ctype._the_instance = object.__new__(ctype)
      return ctype._the_instance

class Borg(object):   
   """ Note, the init method will be called multiple times. """
   def __new__(ctype):
      self = object.__new__(ctype)
      if not '_state' in ctype.__dict__:
         ctype._state = {}
      self.__dict__ = ctype._state
      return self
