summaryrefslogtreecommitdiffstats
path: root/acf2/model/node.lua
diff options
context:
space:
mode:
Diffstat (limited to 'acf2/model/node.lua')
-rw-r--r--acf2/model/node.lua65
1 files changed, 38 insertions, 27 deletions
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)