Do not use PyModule_GetDict().
Clean up the example of exporting a C-callable API from an extension module.
Add a hyperlink to a related section in the Python/C API reference.
diff --git a/Doc/ext/extending.tex b/Doc/ext/extending.tex
index 90385e1..41bdab5 100644
--- a/Doc/ext/extending.tex
+++ b/Doc/ext/extending.tex
@@ -217,12 +217,13 @@
 void
 initspam(void)
 {
-    PyObject *m, *d;
+    PyObject *m;
 
     m = Py_InitModule("spam", SpamMethods);
-    d = PyModule_GetDict(m);
+
     SpamError = PyErr_NewException("spam.error", NULL, NULL);
-    PyDict_SetItemString(d, "error", SpamError);
+    Py_INCREF(SpamError);
+    PyModule_AddObject(m, "error", SpamError);
 }
 \end{verbatim}
 
@@ -1277,13 +1278,8 @@
     /* Create a CObject containing the API pointer array's address */
     c_api_object = PyCObject_FromVoidPtr((void *)PySpam_API, NULL);
 
-    if (c_api_object != NULL) {
-        /* Create a name for this object in the module's namespace */
-        PyObject *d = PyModule_GetDict(m);
-
-        PyDict_SetItemString(d, "_C_API", c_api_object);
-        Py_DECREF(c_api_object);
-    }
+    if (c_api_object != NULL)
+        PyModule_AddObject(m, "_C_API", c_api_object);
 }
 \end{verbatim}
 
@@ -1324,16 +1320,21 @@
 #define PySpam_System \
  (*(PySpam_System_RETURN (*)PySpam_System_PROTO) PySpam_API[PySpam_System_NUM])
 
-#define import_spam() \
-{ \
-  PyObject *module = PyImport_ImportModule("spam"); \
-  if (module != NULL) { \
-    PyObject *module_dict = PyModule_GetDict(module); \
-    PyObject *c_api_object = PyDict_GetItemString(module_dict, "_C_API"); \
-    if (PyCObject_Check(c_api_object)) { \
-      PySpam_API = (void **)PyCObject_AsVoidPtr(c_api_object); \
-    } \
-  } \
+/* Return -1 and set exception on error, 0 on success. */
+static int
+import_spam(void)
+{
+    PyObject *module = PyImport_ImportModule("spam");
+
+    if (module != NULL) {
+        PyObject *c_api_object = PyObject_GetAttrString(module, "_C_API");
+        if (c_api_object == NULL)
+            return -1;
+        if (PyCObject_Check(c_api_object))
+            PySpam_API = (void **)PyCObject_AsVoidPtr(c_api_object);
+        Py_DECREF(c_api_object);
+    }
+    return 0;
 }
 
 #endif
@@ -1357,7 +1358,9 @@
     PyObject *m;
 
     Py_InitModule("client", ClientMethods);
-    import_spam();
+    if (import_spam() < 0)
+        return;
+    /* additional initialization can happen here */
 }
 \end{verbatim}
 
@@ -1370,6 +1373,7 @@
 functionality, which is especially useful for memory allocation and
 deallocation of the pointer stored in a CObject. The details
 are described in the \citetitle[../api/api.html]{Python/C API
-Reference Manual} in the section ``CObjects'' and in the
-implementation of CObjects (files \file{Include/cobject.h} and
+Reference Manual} in the section
+``\ulink{CObjects}{../api/cObjects.html}'' and in the implementation
+of CObjects (files \file{Include/cobject.h} and
 \file{Objects/cobject.c} in the Python source code distribution).