From 2d58b8f49ec03fe3d4ad843085ffe09880e3f888 Mon Sep 17 00:00:00 2001 From: Kaarle Ritvanen Date: Wed, 11 Mar 2015 11:31:36 +0200 Subject: model: callable topology table for relative traversal --- aconf/model/root.lua | 48 ++++++++++++++++++++++++------------------------ 1 file 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 -- cgit v1.2.3