Index: twisted/python/modules.py
===================================================================
--- twisted/python/modules.py	(revision 36613)
+++ twisted/python/modules.py	(working copy)
@@ -708,7 +708,18 @@
                 return module
         raise KeyError(modname)
 
+    def __contains__(self, module):
+        """
+        Check to see whether or not a module exists on my sysPath.
 
+        @param module: The module to look for on my sysPath
+        """
+        try:
+            self.__getitem__(module)
+            return True
+        except KeyError:
+            return False
+
     def __repr__(self):
         """
         Display my sysPath and moduleDict in a string representation.
Index: twisted/test/test_modules.py
===================================================================
--- twisted/test/test_modules.py	(revision 36613)
+++ twisted/test/test_modules.py	(working copy)
@@ -492,3 +492,13 @@
             "(PEP 302 violation - check your local configuration).")
         self.assertEqual(len(warnings), 1)
         self.assertEqual(thisModule.name, __name__)
+
+
+    def test_containsModule(self):
+        """
+        PythonPath should support the __contains__ API to check whether or not
+        a particular module is on this path.
+        """
+        thePath = modules.PythonPath()
+        self.assertIn('os', thePath)
+        self.assertNotIn('bogusModule', thePath)
