#include <Python.h>

staticforward PyTypeObject noddy_NoddyType;

typedef struct {
    PyObject_HEAD
    /* Type-specific fields go here. */
} noddy_NoddyObject;

static PyObject*
noddy_new_noddy(PyObject* self, PyObject* args)
{
    noddy_NoddyObject* noddy;

    noddy = PyObject_New(noddy_NoddyObject, &noddy_NoddyType);

    /* Initialize type-specific fields here. */

    return (PyObject*)noddy;
}

static void
noddy_noddy_dealloc(PyObject* self)
{
    /* Free any external resources here;
     * if the instance owns references to any Python
     * objects, call Py_DECREF() on them here.
     */
    PyObject_Del(self);
}

statichere PyTypeObject noddy_NoddyType = {
    PyObject_HEAD_INIT(NULL)
    0,
    "Noddy",
    sizeof(noddy_NoddyObject),
    0,
    noddy_noddy_dealloc, /*tp_dealloc*/
    0,          /*tp_print*/
    0,          /*tp_getattr*/
    0,          /*tp_setattr*/
    0,          /*tp_compare*/
    0,          /*tp_repr*/
    0,          /*tp_as_number*/
    0,          /*tp_as_sequence*/
    0,          /*tp_as_mapping*/
    0,          /*tp_hash */
};

static PyMethodDef noddy_methods[] = {
    {"new_noddy", noddy_new_noddy, METH_NOARGS,
     "Create a new Noddy object."},

    {NULL}  /* Sentinel */
};

DL_EXPORT(void)
initnoddy(void) 
{
    noddy_NoddyType.ob_type = &PyType_Type;
    if (PyType_Ready(&noddy_NoddyType))
        return;

    Py_InitModule3("noddy", noddy_methods
                   "Example module that creates an extension type.");
}
