From 6073e42010ae41bde396d5b140def71c32376f9d Mon Sep 17 00:00:00 2001 From: Kaarle Ritvanen Date: Tue, 17 Dec 2013 16:56:41 +0200 Subject: model: lazy evaluation for all TreeNode metadata --- acf2/model/model.lua | 11 +++------ acf2/model/node.lua | 65 ++++++++++++++++++++++++++++++---------------------- acf2/model/set.lua | 3 +-- 3 files changed, 42 insertions(+), 37 deletions(-) (limited to 'acf2') diff --git a/acf2/model/model.lua b/acf2/model/model.lua index fdb7c96..e17d328 100644 --- a/acf2/model/model.lua +++ b/acf2/model/model.lua @@ -105,7 +105,7 @@ end M.Model = M.new(node.TreeNode) function M.Model:init(context) - super(self, M.Model):init(context) + super(self, M.Model):init(context, 'model') local mt = getmetatable(self) @@ -186,13 +186,8 @@ function M.Model:init(context) return map(function(m) return m:meta() end, _members(tpe)) end - 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 + function mt.init_meta(meta) + util.update(meta, {fields=tmeta(Field), actions=tmeta(M.Action)}) end function mt.members() diff --git a/acf2/model/node.lua b/acf2/model/node.lua index 02eb12f..59c495d 100644 --- a/acf2/model/node.lua +++ b/acf2/model/node.lua @@ -13,7 +13,9 @@ local isinstance = object.isinstance local super = object.super local pth = require('acf2.path') + local util = require('acf2.util') +local update = util.update function M.null_addr(path, name) return '/null'..pth.join(path, name) end @@ -55,12 +57,27 @@ local function equal_tns(tn1, tn2) return getmetatable(tn1).path == getmetatable(tn2).path end -function M.TreeNode:init(context) +function M.TreeNode:init(context, dtype) local mt = getmetatable(self) - util.update(mt, context) + update(mt, context) mt.__eq = equal_tns - mt._meta = {} + + function mt.meta() + if not mt._meta then + mt._meta = {type=dtype} + if mt.txn then + if mt.parent then + mt._meta['ui-name'] = getmetatable(mt.parent).mmeta( + pth.name(mt.path) + )['ui-name'] + end + mt.init_meta(mt._meta) + end + end + return mt._meta + end + function mt.get(k, options) return mt.load(k, options) end function mt.removable() return true end @@ -74,12 +91,6 @@ function M.TreeNode:init(context) if not mt.txn then return end - if mt.parent then - mt._meta['ui-name'] = getmetatable(mt.parent).mmeta( - pth.name(mt.path) - )['ui-name'] - end - function mt.save(k, v) rawset(self, k, v) end function mt.__index(t, k) return mt.get(k) end function mt.__newindex(t, k, v) mt.save(k, v) end @@ -160,8 +171,8 @@ end M.Collection = class(M.TreeNode) -function M.Collection:init(context, params) - super(self, M.Collection):init(context) +function M.Collection:init(context, params, dtype) + super(self, M.Collection):init(context, dtype or 'collection') self.init = nil self.fetch = nil @@ -180,23 +191,24 @@ function M.Collection:init(context, params) if not mt.txn then return end - mt._meta.type = 'collection' - mt._meta.editable = params.editable - mt._meta.required = params.required - 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 + function mt.init_meta(meta) + update( + meta, + { + editable=params.editable, + members=field:meta(), + required=params.required, + ['ui-member']=params.ui_member or meta['ui-name']:gsub('s$', ''), + widget=params.layout + } + ) end function mt.mmeta(name) - local res = util.copy(mt.meta().members) + local meta = mt.meta() + local res = util.copy(meta.members) if name ~= pth.wildcard then - res['ui-name'] = mt._meta['ui-member']..' '..name + res['ui-name'] = meta['ui-member']..' '..name end return res end @@ -226,11 +238,10 @@ end M.List = class(M.Collection) -function M.List:init(context, params) - super(self, M.List):init(context, params) +function M.List:init(context, params, dtype) + super(self, M.List):init(context, params, dtype or 'list') local mt = getmetatable(self) - 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 713da8b..4fcbc24 100644 --- a/acf2/model/set.lua +++ b/acf2/model/set.lua @@ -18,7 +18,7 @@ function M.Set:init(context, params) assert(not object.isinstance(params.field, TreeNode)) params.field.dereference = false - object.super(self, M.Set):init(context, params) + object.super(self, M.Set):init(context, params, 'set') local function find(value) for i, member in node.pairs(self) do @@ -27,7 +27,6 @@ function M.Set:init(context, params) end local mt = getmetatable(self) - mt._meta.type = 'set' function mt.get(k, options) options = setdefaults(options or {}, {dereference=true}) -- cgit v1.2.3