+#include "py/python.hpp"
+
+#include <iostream>
+
+namespace py = boost::python;
+
+MussaPython::MussaPython()
+{
+ try {
+ // add our mussa module to our environment
+ PyImport_AppendInittab("mussa", &initmussa);
+ // go ahead and finish initalizing python
+ Py_Initialize();
+ // get reference to the global namespace
+ py::object main_module(
+ (py::handle<>(py::borrowed(PyImport_AddModule("__main__"))))
+ );
+ main_namespace = main_module.attr("__dict__");
+ // FIXME: this really should be a configuration file?
+ run("import __main__\n"
+ "import mussa\n"
+ "import webbrowser\n");
+ } catch (py::error_already_set e) {
+ PyErr_Print();
+ }
+}
+
+void MussaPython::run(std::string code)
+{
+ try {
+ PyObject *global_ptr = main_namespace.ptr();
+ py::object result( py::handle<>(
+ (PyRun_String(code.c_str(), Py_file_input, global_ptr, global_ptr)
+ )));
+ } catch( py::error_already_set ) {
+ PyErr_Print();
+ }
+}
+
+py::object MussaPython::eval(std::string code)
+{
+ try {
+ PyObject *global_ptr = main_namespace.ptr();
+ py::object result( py::handle<>(
+ (PyRun_String(code.c_str(), Py_eval_input, global_ptr, global_ptr)
+ )));
+ return result;
+ } catch( py::error_already_set ) {
+ PyErr_Print();
+ }
+ py::object result;
+ return result;
+}
+
+
+void MussaPython::interpreter(FILE *fp)
+{
+ try {
+ PyRun_InteractiveLoop(fp, "mussa");
+ } catch (py::error_already_set e) {
+ PyErr_Print();
+ }
+}
+
+py::object MussaPython::operator[](std::string name)
+{
+ std::string code = "reduce(lambda m,n: m.__dict__[n], [__main__] + '";
+ code += name;
+ code += "'.split('.'))";
+ return eval(code);
+ /*
+ py::object py_name(name);
+ py::object name_list = py_name.attr("split")(".");
+ int name_list_len = extract<int>(name_list.attr("__len__")());
+ py::object lookup = main_namespace["__main__"];
+ for(int i=0; i < name_list_len; ++i) {
+ lookup = lookup.attr("__dict__")(name_list[i]);
+ //std::cout << lookup << std::endl;
+ }
+ return lookup;
+ */
+}
+
+//! return a reference to a single mussa python interpreter
+MussaPython& get_py()
+{
+ static MussaPython py;
+ return py;
+}
+
+