class Server(object):

    # singleton
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super(Server, cls).__new__(cls, *args, **kwargs)
            return cls._instance

    def connect(self, cfg, customAppSettings=None,
                wrapper='StopableWSGIServer'):
        if customAppSettings is None:
            customAppSettings = {}
        self.cfg = cfg
        self.app_settings = appconfig(
            'config:' + os.path.join(
                os.path.dirname(__file__), '../../', self.cfg['app']['ini']
            )
        )
        # store some derived variables
        self.app_settings['sqlalchemy.url'] = 'sqlite:///'+self.cfg['app']['db']
        # merge/override appConfig with custom settings in cfg
        self.app_settings.update(self.cfg['app']['appSettings'])
        # merge/override appConfig with individual custom settings
        self.app_settings.update(customAppSettings)
        # app
        engine = engine_from_config(self.app_settings)
        DBSession.configure(bind=engine)
        Base.metadata.create_all(engine)
        from c3smembership import main
        app = main({}, **self.app_settings)
        # create srv
        if wrapper == 'StopableWSGIServer':
            self.srv = StopableWSGIServer.create(
                app,
                host=self.cfg['app']['host'],
                port=self.cfg['app']['port']
            )
            # check srv
            if not self.srv.wait():
                raise Exception('Server could not be fired up. Exiting ...')
        elif wrapper == 'TestApp':
            self.srv = TestApp(app)
        else:
            raise Exception('Wrapper could not be found. Exiting ...')
        # store some variables
        self.srv.db = DBSession
        self.srv.url = 'http://' + self.cfg['app']['host'] + ':' \
                       + self.cfg['app']['port'] + '/'
        return self.srv

    def disconnect(self):
        self.srv.db.close()
        self.srv.db.remove()
        os.remove(self.cfg['app']['db'])
        if isinstance(self.srv, StopableWSGIServer):
            self.srv.shutdown()

    def shutdown(self):
        if isinstance(self.srv, StopableWSGIServer):
            self.srv.shutdown()
        DBSession.close()
        DBSession.remove()