f.write('\n// ---------------------------------------------------\n//\n// Gateway Implementation\n\n// Std delegation\nSTDMETHODIMP_(ULONG) PyGEnum%(enumtype)s::AddRef(void) {return PyGatewayBase::AddRef();}\nSTDMETHODIMP_(ULONG) PyGEnum%(enumtype)s::Release(void) {return PyGatewayBase::Release();}\nSTDMETHODIMP PyGEnum%(enumtype)s::QueryInterface(REFIID iid, void ** obj) {return PyGatewayBase::QueryInterface(iid, obj);}\nSTDMETHODIMP PyGEnum%(enumtype)s::GetTypeInfoCount(UINT FAR* pctInfo) {return PyGatewayBase::GetTypeInfoCount(pctInfo);}\nSTDMETHODIMP PyGEnum%(enumtype)s::GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo FAR* FAR* pptInfo) {return PyGatewayBase::GetTypeInfo(itinfo, lcid, pptInfo);}\nSTDMETHODIMP PyGEnum%(enumtype)s::GetIDsOfNames(REFIID refiid, OLECHAR FAR* FAR* rgszNames, UINT cNames, LCID lcid, DISPID FAR* rgdispid) {return PyGatewayBase::GetIDsOfNames( refiid, rgszNames, cNames, lcid, rgdispid);}\nSTDMETHODIMP PyGEnum%(enumtype)s::Invoke(DISPID dispid, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR* params, VARIANT FAR* pVarResult, EXCEPINFO FAR* pexcepinfo, UINT FAR* puArgErr) {return PyGatewayBase::Invoke( dispid, riid, lcid, wFlags, params, pVarResult, pexcepinfo, puArgErr);}\n\nSTDMETHODIMP PyGEnum%(enumtype)s::Next( \n /* [in] */ ULONG celt,\n /* [length_is][size_is][out] */ %(argdeclare)s,\n /* [out] */ ULONG __RPC_FAR *pCeltFetched)\n{\n\tPY_GATEWAY_METHOD;\n\tPyObject *result;\n\tHRESULT hr = InvokeViaPolicy("Next", &result, "i", celt);\n\tif ( FAILED(hr) )\n\t\treturn hr;\n\n\tif ( !PySequence_Check(result) )\n\t\tgoto error;\n\tint len;\n\tlen = PyObject_Length(result);\n\tif ( len == -1 )\n\t\tgoto error;\n\tif ( len > (int)celt)\n\t\tlen = celt;\n\n\tif ( pCeltFetched )\n\t\t*pCeltFetched = len;\n\n\tint i;\n\tfor ( i = 0; i < len; ++i )\n\t{\n\t\tPyObject *ob = PySequence_GetItem(result, i);\n\t\tif ( ob == NULL )\n\t\t\tgoto error;\n\n\t\t%(converter)s\n\t\t{\n\t\t\tPy_DECREF(result);\n\t\t\treturn PyCom_SetCOMErrorFromPyException(IID_IEnum%(enumtype)s);\n\t\t}\n\t}\n\n\tPy_DECREF(result);\n\n\treturn len < (int)celt ? S_FALSE : S_OK;\n\n error:\n\tPyErr_Clear();\t// just in case\n\tPy_DECREF(result);\n\treturn PyCom_SetCOMErrorFromSimple(E_FAIL, IID_IEnum%(enumtype)s, "Next() did not return a sequence of objects");\n}\n\nSTDMETHODIMP PyGEnum%(enumtype)s::Skip( \n /* [in] */ ULONG celt)\n{\n\tPY_GATEWAY_METHOD;\n\treturn InvokeViaPolicy("Skip", NULL, "i", celt);\n}\n\nSTDMETHODIMP PyGEnum%(enumtype)s::Reset(void)\n{\n\tPY_GATEWAY_METHOD;\n\treturn InvokeViaPolicy("Reset");\n}\n\nSTDMETHODIMP PyGEnum%(enumtype)s::Clone( \n /* [out] */ IEnum%(enumtype)s __RPC_FAR *__RPC_FAR *ppEnum)\n{\n\tPY_GATEWAY_METHOD;\n\tPyObject * result;\n\tHRESULT hr = InvokeViaPolicy("Clone", &result);\n\tif ( FAILED(hr) )\n\t\treturn hr;\n\n\t/*\n\t** Make sure we have the right kind of object: we should have some kind\n\t** of IUnknown subclass wrapped into a PyIUnknown instance.\n\t*/\n\tif ( !PyIBase::is_object(result, &PyIUnknown::type) )\n\t{\n\t\t/* the wrong kind of object was returned to us */\n\t\tPy_DECREF(result);\n\t\treturn PyCom_SetCOMErrorFromSimple(E_FAIL, IID_IEnum%(enumtype)s);\n\t}\n\n\t/*\n\t** Get the IUnknown out of the thing. note that the Python ob maintains\n\t** a reference, so we don\'t have to explicitly AddRef() here.\n\t*/\n\tIUnknown *punk = ((PyIUnknown *)result)->m_obj;\n\tif ( !punk )\n\t{\n\t\t/* damn. the object was released. */\n\t\tPy_DECREF(result);\n\t\treturn PyCom_SetCOMErrorFromSimple(E_FAIL, IID_IEnum%(enumtype)s);\n\t}\n\n\t/*\n\t** Get the interface we want. note it is returned with a refcount.\n\t** This QI is actually going to instantiate a PyGEnum%(enumtype)s.\n\t*/\n\thr = punk->QueryInterface(IID_IEnum%(enumtype)s, (LPVOID *)ppEnum);\n\n\t/* done with the result; this DECREF is also for <punk> */\n\tPy_DECREF(result);\n\n\treturn PyCom_SetCOMErrorFromSimple(hr, IID_IEnum%(enumtype)s, "Python could not convert the result from Next() into the required COM interface");\n}\n' % locals())