summaryrefslogtreecommitdiffstats
path: root/aconf/model
diff options
context:
space:
mode:
Diffstat (limited to 'aconf/model')
-rw-r--r--aconf/model/root.lua48
1 files changed, 24 insertions, 24 deletions
diff --git a/aconf/model/root.lua b/aconf/model/root.lua
index e8525db..2a135f2 100644
--- a/aconf/model/root.lua
+++ b/aconf/model/root.lua
@@ -34,32 +34,32 @@ function M.RootModel:meta(path)
end
-local _topology = {}
local order = 0
-
-function M.topology(addr, create)
- local top = _topology
- if type(addr) == 'table' then addr = util.copy(addr)
- else addr = address.split(addr) end
-
- local function defaults(top)
- return util.setdefaults(top, {members={}, paths={}, referrers={}})
- end
-
- while #addr > 0 do
- local comp = address.escape(addr[1])
- if create then
- top = setdefault(defaults(top).members, comp, {order=order})
- order = order + 1
- else
- top = top.members[comp] or top.members['*']
- if not top then return end
+M.topology = setmetatable(
+ {},
+ {
+ __call=function(self, addr, create)
+ util.setdefaults(self, {members={}, paths={}, referrers={}})
+
+ if type(addr) == 'table' then addr = util.copy(addr)
+ else addr = address.split(addr) end
+ if not addr[1] then return self end
+
+ local comp = address.escape(addr[1])
+ local top
+ if create then
+ top = setdefault(self.members, comp, {order=order})
+ order = order + 1
+ else
+ top = self.members[comp] or self.members['*']
+ if not top then return end
+ end
+ table.remove(addr, 1)
+
+ return setmetatable(top, getmetatable(self))(addr, create)
end
- table.remove(addr, 1)
- end
-
- return defaults(top)
-end
+ }
+)
function M.register(name, field, params)
if not params then params = {} end