I use a registration process in my InsertArg script... I have an object of internal functions: availFuncs = { getabils: getabils, getattrs: getattrs }; So I can check the object for the function name (the key) and throw my arguments at the actual function (stored as the value). I don't want to expose this object directly, but I provide a way for other scripters to register their function to my object: const registerRule = (...r) => { // pass in a list of functions to get them registered to the availFuncs library r.forEach(f => { if (f.name) { if (availFuncs[f.name]) { log(`IA Function Registration: Name collision detected for ${f.name}. Last one loaded will win.`); delete availHelp[f.name]; } availFuncs[f.name] = f; } }); }; I expose that registerRule as RegisterRule in the public interface of my script, so if you wrote a function to add to the InsertArg library you could then call: ia.RegisterRule(PhilipPhunction); ...in an on('ready') event handler, and my script would be able to use it. Your PhilipPhunction could be in its own file and in its own namespace, but that way you could register it to let InsertArg know to use it. For your implementation, the user would have a number of "schema" registered (or not... maybe they chose the set up a la carte style), so I would give them a config screen (or help handout) with buttons that let them set a variable in state to drive which schema is the default for their game.