summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--acf/model/model.lua20
-rw-r--r--acf/model/node.lua28
2 files changed, 22 insertions, 26 deletions
diff --git a/acf/model/model.lua b/acf/model/model.lua
index 575df99..8892221 100644
--- a/acf/model/model.lua
+++ b/acf/model/model.lua
@@ -106,24 +106,24 @@ function Model:init(context)
local mt = getmetatable(self)
- local function member(name, strict, tpe)
+ function mt.member(name, loose, tpe)
local m = mt.class[name]
if not tpe then tpe = Member end
if not isinstance(m, tpe) then m = nil end
if m == nil then
- if strict then raise(mt.path, 'Does not exist: '..name) end
- return
+ if loose then return end
+ raise(mt.path, 'Does not exist: '..name)
end
- return BoundMember(self, m)
+ return BoundMember(self, name, m)
end
local function _members(tpe)
local res = {}
for _, name in ipairs(self.members) do
- local m = member(name, false, tpe)
+ local m = mt.member(name, true, tpe)
if m then table.insert(res, m) end
end
return res
@@ -135,13 +135,11 @@ function Model:init(context)
return res
end
- function mt.valid_member(name) return member(name) end
-
function mt.load(k, create)
local v = mt.class[k]
if isinstance(v, Field) then
- v = BoundMember(self, v)
+ v = BoundMember(self, k, v)
if v.compute then return v:compute() end
return v:load(create)
end
@@ -149,7 +147,7 @@ function Model:init(context)
assert(mt.txn)
if isinstance(v, Action) then
- local f = v.field and BoundMember(self, v.field)
+ local f = v.field and BoundMember(self, k, v.field)
if create then return f and f:load(true) end
return function(var)
@@ -172,9 +170,9 @@ function Model:init(context)
if not mt.txn then return end
- function mt.mmeta(name) return member(name, true):meta() end
+ function mt.mmeta(name) return mt.member(name):meta() end
- function mt.save(k, v) return member(k, true, Field):save(v) end
+ function mt.save(k, v) return mt.member(k, false, Field):save(v) end
local function tmeta(tpe)
return util.map(function(m) return m:meta() end, _members(tpe))
diff --git a/acf/model/node.lua b/acf/model/node.lua
index d038e6e..4c05d4d 100644
--- a/acf/model/node.lua
+++ b/acf/model/node.lua
@@ -16,7 +16,7 @@ local util = require('acf.util')
BoundMember = class()
-function BoundMember:init(parent, field)
+function BoundMember:init(parent, name, field)
local pmt = getmetatable(parent)
local mt = {}
@@ -24,12 +24,6 @@ function BoundMember:init(parent, field)
local member = field[k]
if type(member) ~= 'function' then return member end
return function(self, ...)
- local name
- if field.name then name = field.name
- else
- name = arg[1]
- table.remove(arg, 1)
- end
return member(
field,
{
@@ -92,7 +86,7 @@ function TreeNode:fetch(path, create)
local mt = getmetatable(self)
local name = path[1]
- if not mt.valid_member(name) then
+ if not mt.member(name) then
raise(mt.path, 'Member does not exist: '..name)
end
@@ -118,17 +112,21 @@ function Collection:init(context, params)
self.init = nil
self.fetch = nil
- local field = BoundMember(self, params.field)
-
local mt = getmetatable(self)
- function mt.topology() return field:topology(pth.wildcard) end
- function mt.valid_member(name) return true end
- function mt.load(k, create) return field:load(k, create) end
+ local field = BoundMember(self, pth.wildcard, params.field)
+
+ function mt.topology() return field:topology() end
+
+ function mt.member(name)
+ return BoundMember(self, name, params.field)
+ end
+
+ function mt.load(k, create) return mt.member(k):load(create) end
if not mt.txn then return end
mt.meta.type = 'collection'
- mt.meta.members = field:meta(pth.wildcard)
+ mt.meta.members = field:meta()
mt.meta['ui-member'] = params.ui_member or string.gsub(
mt.meta['ui-name'], 's$', ''
)
@@ -150,7 +148,7 @@ function Collection:init(context, params)
end
end
- function mt.save(k, v) field:save(k, v) end
+ function mt.save(k, v) mt.member(k):save(v) end
end