// Now get the pointer value from the string and save in dest
 
-  f << tab4 << "if (" << src << ") {\n"
-    << tab8 << "if (" << src << " == Py_None) { " << dest << " = NULL; }\n"
-    << tab8 << "else if (SWIG_GetPtrObj(" << src << ",(void **) &" << dest << ",";
+    if (t->is_reference)
+        f << tab4 << "if (" << src << ") {\n"
+          << tab8 << "if (SWIG_GetPtrObj(" << src << ",(void **) &" << dest << ",";
+    else
+        f << tab4 << "if (" << src << ") {\n"
+          << tab8 << "if (" << src << " == Py_None) { " << dest << " = NULL; }\n"
+          << tab8 << "else if (SWIG_GetPtrObj(" << src << ",(void **) &" << dest << ",";
 
   // If we're passing a void pointer, we give the pointer conversion a NULL
   // pointer, otherwise pass in the expected type.
        func << tab4 << "\"\"\"" << add_docstring(doc_entry) << "\"\"\"\n";
       }
 
-      func << tab4 << "val = apply(" << module << "." << iname << ",_args,_kwargs)\n";
+      func << tab4 << "val = " << module << "." << iname << "(*_args,**_kwargs)\n";
 
       if (munge_return) {
        //  If the output of this object has been remapped in any way, we're