diff --git a/trunk/src/persistent/cPickleCache.c b/trunk/src/persistent/cPickleCache.c
index baca672871c2c423ef3fb4ce3b73d5f24f14508d..9132acabb8eeb214fda8ccfe51812e9fb62b235d 100644
--- a/trunk/src/persistent/cPickleCache.c
+++ b/trunk/src/persistent/cPickleCache.c
@@ -90,7 +90,7 @@ process must skip such objects, rather than deactivating them.
 static char cPickleCache_doc_string[] =
 "Defines the PickleCache used by ZODB Connection objects.\n"
 "\n"
-"$Id: cPickleCache.c,v 1.90 2004/03/02 15:37:38 jeremy Exp $\n";
+"$Id: cPickleCache.c,v 1.91 2004/03/02 22:13:54 jeremy Exp $\n";
 
 #define DONT_USE_CPERSISTENCECAPI
 #include "cPersistence.h"
@@ -311,8 +311,20 @@ cc_minimize(ccobject *self, PyObject *args)
 static void
 _invalidate(ccobject *self, PyObject *key)
 {
+    static PyObject *_p_invalidate;
     PyObject *v = PyDict_GetItem(self->data, key);
 
+    if (!_p_invalidate) {
+	_p_invalidate = PyString_InternFromString("_p_invalidate");
+	if (!_p_invalidate) {
+	    /* It doesn't make any sense to ignore this error, but
+	       the caller ignores all errors.
+	    */
+	    PyErr_Clear();
+	    return;
+	}
+    }
+
     if (!v)
 	return;
     if (PyType_Check(v)) {
@@ -336,7 +348,16 @@ _invalidate(ccobject *self, PyObject *key)
 		PyErr_Clear();
 	}
     } else {
-	if (PyObject_DelAttr(v, py__p_changed) < 0)
+	PyObject *meth, *err;
+
+	meth = PyObject_GetAttr(v, _p_invalidate);
+	if (!meth) {
+	    PyErr_Clear();
+	    return;
+	}
+	err = PyObject_CallObject(meth, NULL);
+	Py_DECREF(meth);
+	if (!err)
 	    PyErr_Clear();
     }
 }