diff --git a/package/gluon-web-model/luasrc/usr/lib/lua/gluon/web/model.lua b/package/gluon-web-model/luasrc/usr/lib/lua/gluon/web/model.lua index 513fb65e..c40fcd1e 100644 --- a/package/gluon-web-model/luasrc/usr/lib/lua/gluon/web/model.lua +++ b/package/gluon-web-model/luasrc/usr/lib/lua/gluon/web/model.lua @@ -4,6 +4,7 @@ module('gluon.web.model', package.seeall) +local glob = require 'posix.glob' local unistd = require 'posix.unistd' local classes = require 'gluon.web.model.classes' @@ -11,12 +12,13 @@ local util = require 'gluon.web.util' local instanceof = util.instanceof -- Loads a model from given file, creating an environment and returns it -local function load(filename, i18n) +local function load(filename, i18n, supra) + supra = supra or {} local func = assert(loadfile(filename)) setfenv(func, setmetatable({}, {__index = function(tbl, key) - return classes[key] or i18n[key] or _G[key] + return supra[key] or classes[key] or i18n[key] or _G[key] end })) @@ -36,7 +38,9 @@ return function(config, http, renderer, name, pkg) local hidenav = false local modeldir = config.base_path .. '/model/' - local filename = modeldir..name..'.lua' + local filename = modeldir .. name .. '.lua' + local infradir = modeldir .. name .. '/' + local infrafnames = glob.glob(infradir .. '*.lua') or {} if not unistd.access(filename) then error("Model '" .. name .. "' not found!") @@ -50,6 +54,19 @@ return function(config, http, renderer, name, pkg) local maps = load(filename, i18n) + if #infrafnames > 0 and #maps ~= 1 then + error("'" .. name .. "' has got inframaps. It must return a single supramap!") + end + + for _, f in ipairs(infrafnames) do + local m = load(f, i18n, { Supramap = maps[1] }) + if #m ~= 1 then + error("Inframodule '" .. f:sub(#modeldir) .. "' must return the inherited supramap!") + end + hidenav = hidenav or maps[1].hidenav or m[1].hidenav + maps[1] = m[1] + end + for _, map in ipairs(maps) do map:parse(http) end