summaryrefslogtreecommitdiffstats
path: root/acf2
diff options
context:
space:
mode:
authorKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2013-12-17 16:56:41 +0200
committerKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2013-12-17 19:26:32 +0200
commit6073e42010ae41bde396d5b140def71c32376f9d (patch)
tree927472a14fba2f96c9fe3b211499fc9fbad88764 /acf2
parent920d8fa4c980e7e4e0e237fbaa2b9b18b07593be (diff)
downloadacf2-6073e42010ae41bde396d5b140def71c32376f9d.tar.bz2
acf2-6073e42010ae41bde396d5b140def71c32376f9d.tar.xz
model: lazy evaluation for all TreeNode metadata
Diffstat (limited to 'acf2')
-rw-r--r--acf2/model/model.lua11
-rw-r--r--acf2/model/node.lua65
-rw-r--r--acf2/model/set.lua3
3 files changed, 42 insertions, 37 deletions
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})