#pragma once namespace perlbind { class interpreter { public: interpreter(); interpreter(PerlInterpreter* interp) : my_perl(interp) {} interpreter(int argc, const char** argv); interpreter(const interpreter& other) = delete; interpreter(interpreter&& other) = delete; interpreter& operator=(const interpreter& other) = delete; interpreter& operator=(interpreter&& other) = delete; ~interpreter(); PerlInterpreter* get() const { return my_perl; } void load_script(std::string packagename, std::string filename); void eval(const char* str); template T call_sub(const char* subname, Args&&... args) const { detail::sub_caller caller(my_perl); return caller.call_sub(subname, std::forward(args)...); } // returns interface to add bindings to package name package new_package(const char* name) { return package(my_perl, name); } // registers type for blessing objects, returns interface template class_ new_class(const char* name) { static_assert(!std::is_pointer::value && !std::is_reference::value, "new_class 'T' should not be a pointer or reference"); auto typemap = detail::typemap::get(my_perl); auto type_id = detail::usertype::id(); typemap[type_id] = name; return class_(my_perl, name); } // helper to bind functions in default main:: package template void add(const char* name, T&& func) { new_package("main").add(name, std::forward(func)); } private: void init(int argc, const char** argv); bool m_is_owner = false; PerlInterpreter* my_perl = nullptr; }; } // namespace perlbind