#include "python.h"

namespace python {
   
   Module & Module::operator=(PyObject * obj) {
   DEBUG("Module & Module::operator=(PyObject * " << obj << ")");
      if (ptr() != obj) {
         set(obj);
      }
      return *this;
   }

   Module & Module::operator=(const Object & obj) {
   DEBUG("Module & Module::operator=(const Object & " << obj << ")");
      return (*this = *obj);
   }

   void Module::reload() { 
      set( PyImport_ReloadModule( ptr() ) );
      decref();
   }

   bool Module::accepts(PyObject * obj) const { 
      return ( obj != NULL ) ;//and PyModule_Check( obj ); 
   }

   Dict Module::get_dict() { 
      return Dict ( PyModule_GetDict( ptr() ) ) ; 
   }

   Object Module::run_method(string method_name,string argfmt,...) {
   DEBUG("Object Module::run_method(string \""<<method_name<<"\",string \""<<argfmt<<"\",...)");
      va_list argslist;
      va_start(argslist,argfmt.c_str());

      Object method = get_attr(method_name);
      Object args = Py_VaBuildValue(const_cast<char *>( argfmt.c_str() ),argslist);
      Object retval = PyEval_CallObject(*method,*args);
      return retval;
   }

   Object Module::run_method(string method_name,Tuple & args) {
      Object method = get_attr(method_name);
      if ( not method.is_callable() ) {
         throw Exception(method_name + " in " + this->as_string() + "is not callable");
      }
      return Object ( PyObject_CallObject(*method,*args) );
   }
}


syntax highlighted by Code2HTML, v. 0.9.1