@@ -40,17 +40,26 @@ namespace xeus
4040
4141    xeus::xserver * get_server (xeus::xkernel * kernel);
4242
43-     template <class  interpreter_type >
44-     std::unique_ptr<xkernel> make_xkernel ()
43+     template  <class  interpreter_type >
44+     using  builder_type = interpreter_type* (*)(ems::val);
45+ 
46+     template  <class  interpreter_type >
47+     interpreter_type* default_builder (ems::val)
48+     {
49+         return  new  interpreter_type ();
50+     }
51+ 
52+     template <class  interpreter_type , builder_type<interpreter_type> builder>
53+     std::unique_ptr<xkernel> make_xkernel (ems::val js_argv)
4554    {
4655        xeus::xconfiguration config;
4756
4857        using  history_manager_ptr = std::unique_ptr<xeus::xhistory_manager>;
4958        history_manager_ptr hist = xeus::make_in_memory_history_manager ();
5059
51-         using  interpreter_ptr =  std::unique_ptr<interpreter_type>;
52-         
53-          auto  interpreter =  interpreter_ptr ( new   interpreter_type ()); 
60+         std::unique_ptr<interpreter_type> interpreter ;
61+         interpreter. reset ((*builder)(js_argv)); 
62+ 
5463        auto  context = std::make_unique<xeus::xcontext_impl<empty_context_tag>>();
5564
5665        xeus::xkernel * kernel = new  xeus::xkernel (config,
@@ -64,11 +73,11 @@ namespace xeus
6473        return  std::unique_ptr<xkernel>{kernel};
6574    }
6675
67-     template <class  interpreter_type >
76+     template <class  interpreter_type , builder_type<interpreter_type> builder = &default_builder<interpreter_type> >
6877    void  export_kernel (const  std::string kernel_name)
6978    {
7079        ems::class_<xkernel>(kernel_name.c_str ())
71-             .constructor <>(&make_xkernel<interpreter_type>)
80+             .constructor <>(&make_xkernel<interpreter_type, builder >)
7281            .function (" get_server" ems::allow_raw_pointers ())
7382            .function (" start" 
7483        ;
0 commit comments