64 lines
1.4 KiB
Lua

require "oil"
orb = oil.init()
orb:loadidl[[
typedef sequence<string> StringSequence;
exception CompileError {
string message;
string code;
};
interface ComponentAdaptor {
void apply_change(
in StringSequence triggers,
in string state_adaptation_code,
in string code_adaptation_code,
in string new_interface_def
) raises (CompileError);
};
]]
--------------------------------------------------------------------------------
local oo = require "oil.oo"
Adaptor = oo.class()
function Adaptor:__init(class)
return oo.rawnew(self, { class = class })
end
function Adaptor:apply_change(triggers, state, code, iface)
local adaptor, errmsg = loadstring("return function(self)\n"..state.."\nend")
if not adaptor then
oil.assert.exception{ "IDL:CompileError:1.0",
message = errmsg,
code = "function(self)\n"..state.."\nend",
}
end
adaptor = adaptor()
local original = _G[self.class]
local adapted = oo.class({}, original)
_G[self.class] = adapted
for _, name in ipairs(triggers) do
local operation = name
local function trigger(object, ...)
adaptor(object) -- update object state
oo.rawnew(adapted, object) -- update object class
return object[operation](object, unpack(arg))
end
original[operation] = trigger
end
orb:loadidl(iface)
local updater, errmsg = loadstring(code)
if not updater then
oil.assert.exception{ "IDL:CompileError:1.0",
message = errmsg,
code = code,
}
end
updater()
end