    """COMKit

    This plug-in for Webware for Python allows COM objects such as ADO to be
    used in free-threading mode in a threaded app server. See Appendix D of
    the fine book Python Programming on Win32 by Mark Hammond and Andy
    Robinson for details.

    To use COM, simply set EnableCOM to 1 in your AppServer.config file.
    This causes the app server threads to be configured properly for
    COM free-threading. Then go ahead and use win32com inside your servlets.

    """

    __all__ = []

    # This function gets called by the app server during initialization
    def InstallInWebKit(appServer):
        # See if enabling COM was requested
        if appServer.setting('EnableCOM', 0):

            # This must be done BEFORE pythoncom is imported -- see the book mentioned above.
            import sys
            sys.coinit_flags = 0

            # Get the win32 extensions
            import pythoncom

            # Set references to the COM initialize and uninitialize functions
            appServer._initCOM = pythoncom.COINIT_MULTITHREADED
            appServer.initCOM = pythoncom.CoInitializeEx
            appServer.closeCOM = pythoncom.CoUninitialize

            # Monkey-patch this instance of the appServer

            # Grab references to the original initThread and delThread bound
            # methods, which we will replace
            appServer.originalInitThread = appServer.initThread
            appServer.originalDelThread = appServer.delThread

            # Create new versions of initThread and delThread which will call the
            # old versions

            def newInitThread(self):
                # This must be called at the beginning of any thread that uses COM
                self.initCOM(self._initCOM)
                # Call the original initThread
                self.originalInitThread()

            def newDelThread(self):
                # Call the original delThread
                self.originalDelThread()
                # Uninitialize COM
                self.closeCOM()

            # Replace the initThread and delThread methods with our new versions
            import new
            appServer.initThread = new.instancemethod(newInitThread, appServer, appServer.__class__)
            appServer.delThread = new.instancemethod(newDelThread, appServer, appServer.__class__)

            print 'COM has been enabled.'