+// OOR related typemaps and helper functions
+
+%typemap(python, out) wxGridCellRenderer* { $target = wxPyMake_wxGridCellRenderer($source); }
+%typemap(python, out) wxGridCellEditor* { $target = wxPyMake_wxGridCellEditor($source); }
+%typemap(python, out) wxGridCellAttr* { $target = wxPyMake_wxGridCellAttr($source); }
+%typemap(python, out) wxGridCellAttrProvider* { $target = wxPyMake_wxGridCellAttrProvider($source); }
+%typemap(python, out) wxGridTableBase* { $target = wxPyMake_wxGridTableBase($source); }
+
+
+%{
+
+#define wxPyMake_TEMPLATE(TYPE) \
+PyObject* wxPyMake_##TYPE(TYPE* source) { \
+ PyObject* target = NULL; \
+ if (source) { \
+ /* Check if there is already a pointer to a Python object in the \
+ OOR data that we can use. */ \
+ wxPyOORClientData* data = (wxPyOORClientData*)source->GetClientObject(); \
+ if (data) { \
+ target = data->m_obj; \
+ Py_INCREF(target); \
+ } \
+ /* Otherwise make a new wrapper for it the old fashioned way and \
+ give it the OOR treatment */ \
+ if (! target) { \
+ target = wxPyConstructObject(source, wxT(#TYPE), FALSE); \
+ if (target) \
+ source->SetClientObject(new wxPyOORClientData(target)); \
+ } \
+ } else { /* source was NULL so return None. */ \
+ Py_INCREF(Py_None); target = Py_None; \
+ } \
+ return target; \
+} \
+
+
+wxPyMake_TEMPLATE(wxGridCellRenderer)
+wxPyMake_TEMPLATE(wxGridCellEditor)
+wxPyMake_TEMPLATE(wxGridCellAttr)
+wxPyMake_TEMPLATE(wxGridCellAttrProvider)
+wxPyMake_TEMPLATE(wxGridTableBase)
+
+%}
+