From 42f2873c0d3ec9919d93b0fbb4781be05a380eb6 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Sun, 22 Mar 2026 21:23:00 -0700 Subject: [PATCH] feat: add Mixin, CreateFromMixins, and MergeTable utilities MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implement the WoW Mixin pattern used by modern addons: - Mixin(obj, ...) — copies fields from mixin tables into obj - CreateFromMixins(...) — creates a new table from mixin templates - CreateAndInitFromMixin(mixin, ...) — creates and calls Init() - MergeTable(dest, src) — shallow-merge src into dest These enable OOP-style addon architecture used by LibSharedMedia, WeakAuras, and many Ace3-based addons for class/object creation. --- src/addons/lua_engine.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/addons/lua_engine.cpp b/src/addons/lua_engine.cpp index 830925d1..f8fb7ae5 100644 --- a/src/addons/lua_engine.cpp +++ b/src/addons/lua_engine.cpp @@ -5955,6 +5955,26 @@ void LuaEngine::registerCoreAPI() { "function tDeleteItem(tbl, item)\n" " for i = #tbl, 1, -1 do if tbl[i] == item then table.remove(tbl, i) end end\n" "end\n" + // Mixin pattern — used by modern addons for OOP-style object creation + "function Mixin(obj, ...)\n" + " for i = 1, select('#', ...) do\n" + " local mixin = select(i, ...)\n" + " for k, v in pairs(mixin) do obj[k] = v end\n" + " end\n" + " return obj\n" + "end\n" + "function CreateFromMixins(...)\n" + " return Mixin({}, ...)\n" + "end\n" + "function CreateAndInitFromMixin(mixin, ...)\n" + " local obj = CreateFromMixins(mixin)\n" + " if obj.Init then obj:Init(...) end\n" + " return obj\n" + "end\n" + "function MergeTable(dest, src)\n" + " for k, v in pairs(src) do dest[k] = v end\n" + " return dest\n" + "end\n" // String utilities (WoW globals that alias Lua string functions) "strupper = string.upper\n" "strlower = string.lower\n"