работать с плагинами как с высокоуровневыми объектами, спрятав внутри всю кухню (в частности гуиды)
убрать громоздкие конструкции типа Plugin.Call (guid, Action, par1, par2, ...)
обращаться к функциям плагина "естественным" образом: <PlugName>.Action(par1,par2, ...)
таким образом плагин "как-бы" предоставляет библиотеку функций
ConCtrl={}
ConCtrl.mt={}
setmetatable(ConCtrl, ConCtrl.mt)
ConCtrl.mt.__index=function(table,key)
local idConCtrl = "94624B7B-FFDB-435F-B955-F99DBBC3BFE0"
return function(par1, par2)
return Plugin.Call(idConCtrl, key, par1, par2)
end
end
Результат: обращение к Plugin.Call замаскировано, и все возможности плагина можно использовать "натуральным" образом, например: ConCtrl.WindowSize(0,0) ConCtrl.BufferSize(0,0)
и т.д.
------
Обобщая идею.
Что если написать некую функцию типа
function requirePlugIn(NameSpace,id)
_G[NameSpace]={}
_G[NameSpace].mt={}
setmetatable(_G[NameSpace], _G[NameSpace].mt)
_G[NameSpace].mt.__index=
function(table,key)
return function(par1, par2)
return Plugin.Call(id, key, par1, par2)
end
end
end
Тогда для человеческого обращения к функциям любого плагина достаточно будет однократного вызова.
Например:
function requirePlugIn(id)
local NameSpace={}
NameSpace.mt={}
setmetatable(NameSpace, NameSpace.mt)
NameSpace.mt.__index=
function(table,key)
return function(par1, par2)
return Plugin.Call(id, key, par1, par2)
end
end
return NameSpace
end
Я уже писал - с помощью PostMacro годится только если плагин preloaded.
Тут бы надо задействовать кэш. Типа плагин говорит имя своего модуля, и фар его начинает автоматически загружать при запуске.
Конечно, того же можно добиться просто скопировав модуль в каталог автозагружаемых скриптов, но это уже "инсталляция"...
Max Rusov wrote:А как нибудь с "..." не получается?
Я ж не специалист. Думаю получится.
Но в любом случае в луа опущенный параметр приходит в функцию как неинициализированный, т.е. nil (если только в функции не предусмотрен разбор неизвестного числа параметров - vararg)
John Doe wrote:Но в любом случае в луа опущенный параметр приходит в функцию как неинициализированный, т.е. nil (если только в функции не предусмотрен разбор неизвестного числа параметров - vararg)
Ну так в Plugin.Call как раз предусмотрен разбор переменного числа параметров. Это из-за враппера он не работает.
Max Rusov wrote:Конечно, того же можно добиться просто скопировав модуль в каталог автозагружаемых скриптов, но это уже "инсталляция"...
Можно сравнить со стандартной функцией require, которая служит для загрузки модулей служит: вполне нормально, когда вызов require присутствует в каждом скрипте.
Но с другой стороны, библиотеки lua носят простые и короткие имена, и не приходится помнить гуиды (или откуда-то копировать).
Поэтому аналогия между require и предложенным requirePlugIn - с натяжкой.
Update
Возможно стоило бы написать requirePlugIn именно так: перебирает все dll плагинов (или кэш) и получает гуид по имени dll.
И будет вызываться так: requirePlugIn("ConCtrl")
Даже если вызывать в каждом скрипте отдельно - не напряжно.