#define is_PLyPlanObject(x) ((x)->ob_type == &PLy_PlanType)
 static PyObject *PLy_plan_new(void);
 static void PLy_plan_dealloc(PyObject *);
-static PyObject *PLy_plan_getattr(PyObject *, char *);
 static PyObject *PLy_plan_status(PyObject *, PyObject *);
 
 static PyObject *PLy_result_new(void);
 static void PLy_result_dealloc(PyObject *);
-static PyObject *PLy_result_getattr(PyObject *, char *);
 static PyObject *PLy_result_nrows(PyObject *, PyObject *);
 static PyObject *PLy_result_status(PyObject *, PyObject *);
 static Py_ssize_t PLy_result_length(PyObject *);
 static PyObject *PLy_spi_execute_fetch_result(SPITupleTable *, int, int);
 
 
+static PyMethodDef PLy_plan_methods[] = {
+       {"status", PLy_plan_status, METH_VARARGS, NULL},
+       {NULL, NULL, 0, NULL}
+};
+
 static PyTypeObject PLy_PlanType = {
        PyObject_HEAD_INIT(NULL)
        0,                                                      /* ob_size */
         */
        PLy_plan_dealloc,                       /* tp_dealloc */
        0,                                                      /* tp_print */
-       PLy_plan_getattr,                       /* tp_getattr */
+       0,                                                      /* tp_getattr */
        0,                                                      /* tp_setattr */
        0,                                                      /* tp_compare */
        0,                                                      /* tp_repr */
        0,                                                      /* tp_as_buffer */
        Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,       /* tp_flags */
        PLy_plan_doc,                           /* tp_doc */
-};
-
-static PyMethodDef PLy_plan_methods[] = {
-       {"status", PLy_plan_status, METH_VARARGS, NULL},
-       {NULL, NULL, 0, NULL}
+       0,                                                      /* tp_traverse */
+       0,                                                      /* tp_clear */
+       0,                                                      /* tp_richcompare */
+       0,                                                      /* tp_weaklistoffset */
+       0,                                                      /* tp_iter */
+       0,                                                      /* tp_iternext */
+       PLy_plan_methods,                       /* tp_tpmethods */
 };
 
 static PySequenceMethods PLy_result_as_sequence = {
        PLy_result_ass_slice,           /* sq_ass_slice */
 };
 
+static PyMethodDef PLy_result_methods[] = {
+       {"nrows", PLy_result_nrows, METH_VARARGS, NULL},
+       {"status", PLy_result_status, METH_VARARGS, NULL},
+       {NULL, NULL, 0, NULL}
+};
+
 static PyTypeObject PLy_ResultType = {
        PyObject_HEAD_INIT(NULL)
        0,                                                      /* ob_size */
         */
        PLy_result_dealloc,                     /* tp_dealloc */
        0,                                                      /* tp_print */
-       PLy_result_getattr,                     /* tp_getattr */
+       0,                                                      /* tp_getattr */
        0,                                                      /* tp_setattr */
        0,                                                      /* tp_compare */
        0,                                                      /* tp_repr */
        0,                                                      /* tp_as_buffer */
        Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,       /* tp_flags */
        PLy_result_doc,                         /* tp_doc */
-};
-
-static PyMethodDef PLy_result_methods[] = {
-       {"nrows", PLy_result_nrows, METH_VARARGS, NULL},
-       {"status", PLy_result_status, METH_VARARGS, NULL},
-       {NULL, NULL, 0, NULL}
+       0,                                                      /* tp_traverse */
+       0,                                                      /* tp_clear */
+       0,                                                      /* tp_richcompare */
+       0,                                                      /* tp_weaklistoffset */
+       0,                                                      /* tp_iter */
+       0,                                                      /* tp_iternext */
+       PLy_result_methods,                     /* tp_tpmethods */
 };
 
 static PyMethodDef PLy_methods[] = {
 }
 
 
-static PyObject *
-PLy_plan_getattr(PyObject *self, char *name)
-{
-       return Py_FindMethod(PLy_plan_methods, self, name);
-}
-
 static PyObject *
 PLy_plan_status(PyObject *self, PyObject *args)
 {
        arg->ob_type->tp_free(arg);
 }
 
-static PyObject *
-PLy_result_getattr(PyObject *self, char *name)
-{
-       return Py_FindMethod(PLy_result_methods, self, name);
-}
-
 static PyObject *
 PLy_result_nrows(PyObject *self, PyObject *args)
 {