diff options
author | Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> | 2013-11-25 20:25:38 +0200 |
---|---|---|
committer | Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> | 2013-11-25 23:28:39 +0200 |
commit | 878c1bc580d89d70d330eb896d7affc88f776ce0 (patch) | |
tree | e2fde0836efcc94052482e0574b48d24784a8639 | |
parent | a03cf9336873f63a98d0049996465c26b40405b8 (diff) | |
download | aconf-878c1bc580d89d70d330eb896d7affc88f776ce0.tar.bz2 aconf-878c1bc580d89d70d330eb896d7affc88f776ce0.tar.xz |
model: lazy evaluation for member metadata
-rw-r--r-- | acf2/model/model.lua | 13 | ||||
-rw-r--r-- | acf2/model/node.lua | 24 | ||||
-rw-r--r-- | acf2/model/set.lua | 2 |
3 files changed, 25 insertions, 14 deletions
diff --git a/acf2/model/model.lua b/acf2/model/model.lua index 0867fe6..b4f4603 100644 --- a/acf2/model/model.lua +++ b/acf2/model/model.lua @@ -183,12 +183,17 @@ function M.Model:init(context) return map(function(m) return m:meta() end, _members(tpe)) end - mt.meta.type = 'model' - mt.meta.fields = tmeta(Field) - mt.meta.actions = tmeta(M.Action) + mt._meta.type = 'model' + function mt.meta() + if not mt._meta.fields then + mt._meta.fields = tmeta(Field) + mt._meta.actions = tmeta(M.Action) + end + return mt._meta + end function mt.members() - return map(function(f) return f.name end, mt.meta.fields) + return map(function(f) return f.name end, mt.meta().fields) end function mt.validate() diff --git a/acf2/model/node.lua b/acf2/model/node.lua index f10cfce..45167af 100644 --- a/acf2/model/node.lua +++ b/acf2/model/node.lua @@ -61,13 +61,13 @@ function M.TreeNode:init(context) mt.__eq = equal_tns mt.dereference = true - mt.meta = {} + mt._meta = {} function mt.get(k, create) return mt.load(k, {create=create}) end if not mt.txn then return end if mt.parent then - mt.meta['ui-name'] = getmetatable(mt.parent).mmeta( + mt._meta['ui-name'] = getmetatable(mt.parent).mmeta( pth.name(mt.path) )['ui-name'] end @@ -170,15 +170,21 @@ function M.Collection:init(context, params) if not mt.txn then return end - mt.meta.type = 'collection' - mt.meta.members = field:meta() - mt.meta['ui-member'] = params.ui_member or mt.meta['ui-name']:gsub('s$', '') - mt.meta.widget = params.layout + mt._meta.type = 'collection' + mt._meta['ui-member'] = params.ui_member or mt._meta['ui-name']:gsub( + 's$', '' + ) + mt._meta.widget = params.layout + + function mt.meta() + if not mt._meta.members then mt._meta.members = field:meta() end + return mt._meta + end function mt.mmeta(name) - local res = util.copy(mt.meta.members) + local res = util.copy(mt.meta().members) if name ~= pth.wildcard then - res['ui-name'] = mt.meta['ui-member']..' '..name + res['ui-name'] = mt._meta['ui-member']..' '..name end return res end @@ -206,7 +212,7 @@ function M.List:init(context, params) super(self, M.List):init(context, params) local mt = getmetatable(self) - mt.meta.type = 'list' + mt._meta.type = 'list' local save = mt.save function mt.save(k, v) diff --git a/acf2/model/set.lua b/acf2/model/set.lua index 9cd3b4a..0e73b38 100644 --- a/acf2/model/set.lua +++ b/acf2/model/set.lua @@ -25,7 +25,7 @@ function M.Set:init(context, params) local mt = getmetatable(self) mt.dereference = false - mt.meta.type = 'set' + mt._meta.type = 'set' function mt.get(k, create) local i = find(k) |