diff --git a/Doc/extref.tex b/Doc/extref.tex
new file mode 100644
index 0000000..755539a
--- /dev/null
+++ b/Doc/extref.tex
@@ -0,0 +1,514 @@
+
+\section{Extension Reference}
+
+From the viewpoint of of C access to Python services, we have:
+
+\begin{enumerate}
+  \item "Very high level layer": two or three functions that let you exec or
+    eval arbitrary Python code given as a string in a module whose name is
+    given, passing C values in and getting C values out using
+    mkvalue/getargs style format strings.  This does not require the user
+    to declare any variables of type "PyObject *".  This should be enough
+    to write a simple application that gets Python code from the user,
+    execs it, and returns the output or errors.
+
+  \item "Abstract objects layer": which is the subject of this proposal.
+    It has many functions operating on objects, and lest you do many
+    things from C that you can also write in Python, without going
+    through the Python parser.
+
+  \item "Concrete objects layer": This is the public type-dependent
+    interface provided by the standard built-in types, such as floats,
+    strings, and lists.  This interface exists and is currently
+    documented by the collection of include files provides with the
+    Python distributions.
+
+  From the point of view of Python accessing services provided by C
+  modules: 
+
+  \item "Python module interface": this interface consist of the basic
+    routines used to define modules and their members.  Most of the
+    current extensions-writing guide deals with this interface.
+
+  \item "Built-in object interface": this is the interface that a new
+    built-in type must provide and the mechanisms and rules that a
+    developer of a new built-in type must use and follow.
+\end{enumerate}
+
+  The Python C object interface provides four protocols: object,
+  numeric, sequence, and mapping.  Each protocol consists of a
+  collection of related operations.  If an operation that is not
+  provided by a particular type is invoked, then a standard exception,
+  NotImplementedError is raised with a operation name as an argument.
+  In addition, for convenience this interface defines a set of
+  constructors for building objects of built-in types.  This is needed
+  so new objects can be returned from C functions that otherwise treat
+  objects generically.
+
+\subsubsection{Object Protocol}
+     \code{int *PyObject_Print(PyObject *o, FILE *fp, int flags)}\\
+         Print an object \code{o}, on file \code{fp}.  Returns -1 on error
+	 The flags argument is used to enable certain printing
+	 options. The only option currently supported is \code{Py_Print_RAW}. 
+
+     \code{int PyObject_HasAttrString(PyObject *o, char *attr_name)}\\
+         Returns 1 if o has the attribute attr_name, and 0 otherwise.
+     This is equivalent to the Python expression:
+	 \code{hasattr(o,attr_name)}.
+	 This function always succeeds.
+
+     \code{PyObject* PyObject_AttrString(PyObject *o, char *attr_name)}\\
+	 Retrieve an attributed named attr_name form object o.
+	 Returns the attribute value on success, or NULL on failure.
+	 This is the equivalent of the Python expression: \code{o.attr_name}.
+
+
+     \code{int PyObject_HasAttr(PyObject *o, PyObject *attr_name)}\\
+         Returns 1 if o has the attribute attr_name, and 0 otherwise.
+	 This is equivalent to the Python expression:
+	 \code{hasattr(o,attr_name)}. 
+	 This function always succeeds.
+
+
+     \code{PyObject* PyObject_GetAttr(PyObject *o, PyObject *attr_name)}\\
+	 Retrieve an attributed named attr_name form object o.
+	 Returns the attribute value on success, or NULL on failure.
+	 This is the equivalent of the Python expression: o.attr_name.
+
+
+     \code{int PyObject_SetAttrString(PyObject *o, char *attr_name, PyObject *v)}\\
+	 Set the value of the attribute named \code{attr_name}, for object \code{o},
+	 to the value \code{v}. Returns -1 on failure.  This is
+	 the equivalent of the Python statement: \code{o.attr_name=v}.
+
+
+     \code{int PyObject_SetAttr(PyObject *o, PyObject *attr_name, PyObject *v)}\\
+	 Set the value of the attribute named \code{attr_name}, for object \code{o},
+	 to the value \code{v}. Returns -1 on failure.  This is
+	 the equivalent of the Python statement: \code{o.attr_name=v}.
+
+
+     \code{int PyObject_DelAttrString(PyObject *o, char *attr_name)}\\
+	 Delete attribute named \code{attr_name}, for object \code{o}. Returns -1 on
+	 failure.  This is the equivalent of the Python
+	 statement: \code{del o.attr_name}.
+
+
+     \code{int PyObject_DelAttr(PyObject *o, PyObject *attr_name)}\\
+	 Delete attribute named \code{attr_name}, for object \code{o}. Returns -1 on
+	 failure.  This is the equivalent of the Python
+	 statement: \code{del o.attr_name}.
+
+
+     \code{int PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)}\\
+	 Compare the values of \code{o1} and \code{o2} using a routine provided by
+	 \code{o1}, if one exists, otherwise with a routine provided by \code{o2}.
+	 The result of the comparison is returned in \code{result}.  Returns
+	 -1 on failure.  This is the equivalent of the Python
+	 statement: \code{result=cmp(o1,o2)}.
+
+
+     \code{int PyObject_Compare(PyObject *o1, PyObject *o2)}\\
+	 Compare the values of \code{o1} and \code{o2} using a routine provided by
+	 \code{o1}, if one exists, otherwise with a routine provided by \code{o2}.
+	 Returns the result of the comparison on success.  On error,
+	 the value returned is undefined. This is equivalent to the
+	 Python expression: \code{cmp(o1,o2)}.
+
+
+     \code{PyObject *PyObject_Repr(PyObject *o)}\\
+	 Compute the string representation of object, \code{o}.  Returns the
+	 string representation on success, NULL on failure.  This is
+	 the equivalent of the Python expression: \code{repr(o)}.
+	 Called by the \code{repr()} built-in function and by reverse quotes.
+
+
+     \code{PyObject *PyObject_Str(PyObject *o)}\\
+	 Compute the string representation of object, \code{o}.  Returns the
+	 string representation on success, NULL on failure.  This is
+	 the equivalent of the Python expression: \code{str(o)}.
+	 Called by the \code{str()} built-in function and by the \code{print}
+	 statement.
+
+
+     \code{int *PyCallable_Check(PyObject *o))}\\
+	 Determine if the object \code{o}, is callable.  Return 1 if the
+	 object is callable and 0 otherwise.
+	 This function always succeeds.
+
+
+     \code{PyObject *PyObject_CallObject(PyObject *callable_object, PyObject *args)}\\
+	 Call a callable Python object \code{callable_object}, with
+	 arguments given by the tuple \code{args}.  If no arguments are
+	 needed, then args may be NULL.  Returns the result of the
+	 call on success, or NULL on failure.  This is the equivalent
+	 of the Python expression: \code{apply(o,args)}.
+
+     \code{PyObject *PyObject_CallFunction(PyObject *callable_object, char *format, ...)}\\
+         Call a callable Python object \code{callable_object}, with a
+         variable number of C arguments. The C arguments are described
+         using a mkvalue-style format string. The format may be NULL,
+         indicating that no arguments are provided.  Returns the
+         result of the call on success, or NULL on failure.  This is
+         the equivalent of the Python expression: \code{apply(o,args)}.
+
+
+     \code{PyObject *PyObject_CallMethod(PyObject *o, char *m, char *format, ...)}\\
+         Call the method named \code{m} of object \code{o} with a variable number of
+         C arguments.  The C arguments are described by a mkvalue
+         format string.  The format may be NULL, indicating that no
+         arguments are provided. Returns the result of the call on
+         success, or NULL on failure.  This is the equivalent of the
+         Python expression: \code{o.method(args)}.
+         Note that Special method names, such as "\code{__add__}",
+         "\code{__getitem__}", and so on are not supported. The specific
+         abstract-object routines for these must be used.
+
+
+     \code{int PyObject_Hash(PyObject *o)}\\
+         Compute and return the hash value of an object \code{o}.  On
+         failure, return -1.  This is the equivalent of the Python
+         expression: \code{hash(o)}.
+
+
+     \code{int *PyObject_IsTrue(PyObject *o)}\\
+	 Returns 1 if the object \code{o} is considered to be true, and
+	 0 otherwise. This is equivalent to the Python expression:
+	 \code{not not o}.
+	 This function always succeeds.
+	 
+
+     \code{PyObject *PyObject_Type(PyObject *o)}\\
+	 On success, returns a type object corresponding to the object
+	 type of object \code{o}. On failure, returns NULL.  This is
+	 equivalent to the Python expression: \code{type(o)}.
+
+     \code{int PyObject_Length(PyObject *o)}\\
+         Return the length of object \code{o}.  If the object \code{o} provides
+	 both sequence and mapping protocols, the sequence length is
+	 returned. On error, -1 is returned.  This is the equivalent
+	 to the Python expression: \code{len(o)}.
+
+
+     \code{PyObject *PyObject_GetItem(PyObject *o, PyObject *key)}\\
+	 Return element of \code{o} corresponding to the object \code{key} or NULL
+	 on failure. This is the equivalent of the Python expression:
+	 \code{o[key]}.
+
+
+     \code{int PyObject_SetItem(PyObject *o, PyObject *key, PyObject *v)}\\
+	 Map the object \code{key} to the value \code{v}.
+	 Returns -1 on failure.  This is the equivalent
+	 of the Python statement: \code{o[key]=v}.
+
+
+\subsubsection{Number Protocol}
+
+     \code{int PyNumber_Check(PyObject *o)}\\
+         Returns 1 if the object \code{o} provides numeric protocols, and
+	 false otherwise. 
+	 This function always succeeds.
+
+
+     \code{PyObject *PyNumber_Add(PyObject *o1, PyObject *o2)}\\
+	 Returns the result of adding \code{o1} and \code{o2}, or null on failure.
+	 This is the equivalent of the Python expression: \code{o1+o2}.
+
+
+     \code{PyObject *PyNumber_Subtract(PyObject *o1, PyObject *o2)}\\
+	 Returns the result of subtracting \code{o2} from \code{o1}, or null on
+	 failure.  This is the equivalent of the Python expression:
+	 \code{o1-o2}.
+
+
+     \code{PyObject *PyNumber_Multiply(PyObject *o1, PyObject *o2)}\\
+	 Returns the result of multiplying \code{o1} and \code{o2}, or null on
+	 failure.  This is the equivalent of the Python expression:
+	 \code{o1*o2}.
+
+
+     \code{PyObject *PyNumber_Divide(PyObject *o1, PyObject *o2)}\\
+	 Returns the result of dividing \code{o1} by \code{o2}, or null on failure.
+	 This is the equivalent of the Python expression: \code{o1/o2}.
+
+
+     \code{PyObject *PyNumber_Remainder(PyObject *o1, PyObject *o2)}\\
+	 Returns the remainder of dividing \code{o1} by \code{o2}, or null on
+	 failure.  This is the equivalent of the Python expression:
+	 \code{o1\%o2}.
+
+
+     \code{PyObject *PyNumber_Divmod(PyObject *o1, PyObject *o2)}\\
+	 See the built-in function divmod.  Returns NULL on failure.
+	 This is the equivalent of the Python expression:
+	 \code{divmod(o1,o2)}.
+
+
+     \code{PyObject *PyNumber_Power(PyObject *o1, PyObject *o2, PyObject *o3)}\\
+	 See the built-in function pow.  Returns NULL on failure.
+	 This is the equivalent of the Python expression:
+	 \code{pow(o1,o2,o3)}, where \code{o3} is optional.
+
+
+     \code{PyObject *PyNumber_Negative(PyObject *o)}\\
+	 Returns the negation of \code{o} on success, or null on failure.
+	 This is the equivalent of the Python expression: \code{-o}.
+
+
+     \code{PyObject *PyNumber_Positive(PyObject *o)}\\
+         Returns \code{o} on success, or NULL on failure.
+	 This is the equivalent of the Python expression: \code{+o}.
+
+
+     \code{PyObject *PyNumber_Absolute(PyObject *o)}\\
+	 Returns the absolute value of \code{o}, or null on failure.  This is
+	 the equivalent of the Python expression: \code{abs(o)}.
+
+
+     \code{PyObject *PyNumber_Invert(PyObject *o)}\\
+	 Returns the bitwise negation of \code{o} on success, or NULL on
+	 failure.  This is the equivalent of the Python expression:
+	 \code{~o}.
+
+
+     \code{PyObject *PyNumber_Lshift(PyObject *o1, PyObject *o2)}\\
+	 Returns the result of left shifting \code{o1} by \code{o2} on success, or
+	 NULL on failure.  This is the equivalent of the Python
+	 expression: \code{o1 << o2}.
+
+
+     \code{PyObject *PyNumber_Rshift(PyObject *o1, PyObject *o2)}\\
+	 Returns the result of right shifting \code{o1} by \code{o2} on success, or
+	 NULL on failure.  This is the equivalent of the Python
+	 expression: \code{o1 >> o2}.
+
+
+     \code{PyObject *PyNumber_And(PyObject *o1, PyObject *o2)}\\
+	 Returns the result of "anding" \code{o2} and \code{o2} on success and NULL
+	 on failure. This is the equivalent of the Python
+	 expression: \code{o1 and o2}.
+
+
+     \code{PyObject *PyNumber_Xor(PyObject *o1, PyObject *o2)}\\
+	 Returns the bitwise exclusive or of \code{o1} by \code{o2} on success, or
+	 NULL on failure.  This is the equivalent of the Python
+	 expression: \code{o1\^{ }o2}.
+
+     \code{PyObject *PyNumber_Or(PyObject *o1, PyObject *o2)}\\
+	 Returns the result or \code{o1} and \code{o2} on success, or NULL on
+	 failure.  This is the equivalent of the Python expression: 
+	 \code{o1 or o2}.
+
+
+     \code{PyObject *PyNumber_Coerce(PyObject *o1, PyObject *o2)}\\
+         On success, returns a tuple containing \code{o1} and \code{o2} converted to
+	 a common numeric type, or None if no conversion is possible.
+	 Returns -1 on failure. This is equivalent to the Python
+	 expression: \code{coerce(o1,o2)}.
+
+
+     \code{PyObject *PyNumber_Int(PyObject *o)}\\
+	 Returns the \code{o} converted to an integer object on success, or
+	 NULL on failure.  This is the equivalent of the Python
+	 expression: \code{int(o)}.
+
+
+     \code{PyObject *PyNumber_Long(PyObject *o)}\\
+	 Returns the \code{o} converted to a long integer object on success,
+	 or NULL on failure.  This is the equivalent of the Python
+	 expression: \code{long(o)}.
+
+
+     \code{PyObject *PyNumber_Float(PyObject *o)}\\
+	 Returns the \code{o} converted to a float object on success, or NULL
+	 on failure.  This is the equivalent of the Python expression:
+	 \code{float(o)}.
+
+
+\subsubsection{Sequence protocol}
+
+     \code{int PySequence_Check(PyObject *o)}\\
+         Return 1 if the object provides sequence protocol, and 0
+	 otherwise.  
+	 This function always succeeds.
+
+
+     \code{PyObject *PySequence_Concat(PyObject *o1, PyObject *o2)}\\
+	 Return the concatination of \code{o1} and \code{o2} on success, and NULL on
+	 failure.   This is the equivalent of the Python
+	 expression: \code{o1+o2}.
+
+
+     \code{PyObject *PySequence_Repeat(PyObject *o, int count)}\\
+	 Return the result of repeating sequence object \code{o} count times,
+	 or NULL on failure.  This is the equivalent of the Python
+	 expression: \code{o*count}.
+
+
+     \code{PyObject *PySequence_GetItem(PyObject *o, int i)}\\
+	 Return the ith element of \code{o}, or NULL on failure. This is the
+	 equivalent of the Python expression: \code{o[i]}.
+
+
+     \code{PyObject *PySequence_GetSlice(PyObject *o, int i1, int i2)}\\
+	 Return the slice of sequence object \code{o} between \code{i1} and \code{i2}, or
+	 NULL on failure. This is the equivalent of the Python
+	 expression, \code{o[i1:i2]}.
+
+
+     \code{int PySequence_SetItem(PyObject *o, int i, PyObject *v)}\\
+	 Assign object \code{v} to the \code{i}th element of \code{o}.
+Returns -1 on failure.  This is the equivalent of the Python
+	 statement, \code{o[i]=v}.
+
+     \code{int PySequence_SetSlice(PyObject *o, int i1, int i2, PyObject *v)}\\
+         Assign the sequence object \code{v} to the slice in sequence
+	 object \code{o} from \code{i1} to \code{i2}.  This is the equivalent of the Python
+	 statement, \code{o[i1:i2]=v}.
+
+     \code{PyObject *PySequence_Tuple(PyObject *o)}\\
+	 Returns the \code{o} as a tuple on success, and NULL on failure.
+	 This is equivalent to the Python expression: \code{tuple(o)}.
+
+     \code{int PySequence_Count(PyObject *o, PyObject *value)}\\
+         Return the number of occurrences of \code{value} on \code{o}, that is,
+	 return the number of keys for which \code{o[key]==value}.  On
+	 failure, return -1.  This is equivalent to the Python
+	 expression: \code{o.count(value)}.
+
+     \code{int PySequence_In(PyObject *o, PyObject *value)}\\
+	 Determine if \code{o} contains \code{value}.  If an item in \code{o} is equal to
+	 \code{value}, return 1, otherwise return 0.  On error, return -1.  This
+	 is equivalent to the Python expression: \code{value in o}.
+
+     \code{int PySequence_Index(PyObject *o, PyObject *value)}\\
+	 Return the first index for which \code{o[i]=value}.  On error,
+	 return -1.    This is equivalent to the Python
+	 expression: \code{o.index(value)}.
+
+\subsubsection{Mapping protocol}
+
+     \code{int PyMapping_Check(PyObject *o)}\\
+         Return 1 if the object provides mapping protocol, and 0
+	 otherwise.  
+	 This function always succeeds.
+
+
+     \code{int PyMapping_Length(PyObject *o)}\\
+         Returns the number of keys in object \code{o} on success, and -1 on
+	 failure.  For objects that do not provide sequence protocol,
+	 this is equivalent to the Python expression: \code{len(o)}.
+
+
+     \code{int PyMapping_DelItemString(PyObject *o, char *key)}\\
+	 Remove the mapping for object \code{key} from the object \code{o}.
+	 Return -1 on failure.  This is equivalent to
+	 the Python statement: \code{del o[key]}.
+
+
+     \code{int PyMapping_DelItem(PyObject *o, PyObject *key)}\\
+	 Remove the mapping for object \code{key} from the object \code{o}.
+	 Return -1 on failure.  This is equivalent to
+	 the Python statement: \code{del o[key]}.
+
+
+     \code{int PyMapping_HasKeyString(PyObject *o, char *key)}\\
+	 On success, return 1 if the mapping object has the key \code{key}
+	 and 0 otherwise.  This is equivalent to the Python expression:
+	 \code{o.has_key(key)}. 
+	 This function always succeeds.
+
+
+     \code{int PyMapping_HasKey(PyObject *o, PyObject *key)}\\
+	 Return 1 if the mapping object has the key \code{key}
+	 and 0 otherwise.  This is equivalent to the Python expression:
+	 \code{o.has_key(key)}. 
+	 This function always succeeds.
+
+
+     \code{PyObject *PyMapping_Keys(PyObject *o)}\\
+         On success, return a list of the keys in object \code{o}.  On
+	 failure, return NULL. This is equivalent to the Python
+	 expression: \code{o.keys()}.
+
+
+     \code{PyObject *PyMapping_Values(PyObject *o)}\\
+         On success, return a list of the values in object \code{o}.  On
+	 failure, return NULL. This is equivalent to the Python
+	 expression: \code{o.values()}.
+
+
+     \code{PyObject *PyMapping_Items(PyObject *o)}\\
+         On success, return a list of the items in object \code{o}, where
+	 each item is a tuple containing a key-value pair.  On
+	 failure, return NULL. This is equivalent to the Python
+	 expression: \code{o.items()}.
+
+     \code{int PyMapping_Clear(PyObject *o)}\\
+         Make object \code{o} empty.  Returns 1 on success and 0 on failure.
+	 This is equivalent to the Python statement:
+	 \code{for key in o.keys(): del o[key]}
+
+
+     \code{PyObject *PyMapping_GetItemString(PyObject *o, char *key)}\\
+	 Return element of \code{o} corresponding to the object \code{key} or NULL
+	 on failure. This is the equivalent of the Python expression:
+	 \code{o[key]}.
+
+     \code{PyObject *PyMapping_SetItemString(PyObject *o, char *key, PyObject *v)}\\
+         Map the object \code{key} to the value \code{v} in object \code{o}.  Returns 
+         -1 on failure.  This is the equivalent of the Python
+         statement: \code{o[key]=v}.
+
+
+\subsubsection{Constructors}
+
+     \code{PyObject *PyFile_FromString(char *file_name, char *mode)}\\
+	 On success, returns a new file object that is opened on the
+	 file given by \code{file_name}, with a file mode given by \code{mode},
+	 where \code{mode} has the same semantics as the standard C routine,
+	 fopen.  On failure, return -1.
+     
+     \code{PyObject *PyFile_FromFile(FILE *fp, char *file_name, char *mode, int close_on_del)}\\
+	 Return a new file object for an already opened standard C
+	 file pointer, \code{fp}.  A file name, \code{file_name}, and open mode,
+	 \code{mode}, must be provided as well as a flag, \code{close_on_del}, that
+	 indicates whether the file is to be closed when the file
+	 object is destroyed.  On failure, return -1.
+
+     \code{PyObject *PyFloat_FromDouble(double v)}\\
+	 Returns a new float object with the value \code{v} on success, and
+	 NULL on failure.
+     
+     \code{PyObject *PyInt_FromLong(long v)}\\
+	 Returns a new int object with the value \code{v} on success, and
+	 NULL on failure.
+
+     \code{PyObject *PyList_New(int l)}\\
+	 Returns a new list of length \code{l} on success, and NULL on
+	 failure.
+
+     \code{PyObject *PyLong_FromLong(long v)}\\
+	 Returns a new long object with the value \code{v} on success, and
+	 NULL on failure.
+
+     \code{PyObject *PyLong_FromDouble(double v)}\\
+	 Returns a new long object with the value \code{v} on success, and
+	 NULL on failure.
+
+     \code{PyObject *PyDict_New()}\\
+	 Returns a new empty dictionary on success, and NULL on
+	 failure.
+
+     \code{PyObject *PyString_FromString(char *v)}\\
+	 Returns a new string object with the value \code{v} on success, and
+	 NULL on failure.
+
+     \code{PyObject *PyString_FromStringAndSize(char *v, int l)}\\
+	 Returns a new string object with the value \code{v} and length \code{l}
+	 on success, and NULL on failure.
+
+     \code{PyObject *PyTuple_New(int l)}\\
+	 Returns a new tuple of length \code{l} on success, and NULL on
+	 failure.
+
