diff options
Diffstat (limited to 'acf/model/node.lua')
-rw-r--r-- | acf/model/node.lua | 73 |
1 files changed, 33 insertions, 40 deletions
diff --git a/acf/model/node.lua b/acf/model/node.lua index 688336c..b708112 100644 --- a/acf/model/node.lua +++ b/acf/model/node.lua @@ -3,7 +3,7 @@ Copyright (c) 2012-2013 Kaarle Ritvanen See LICENSE file for license details --]] -module(..., package.seeall) +local M = {} local raise = require('acf.error').raise @@ -16,9 +16,9 @@ local pth = require('acf.path') local util = require('acf.util') -BoundMember = class() +M.BoundMember = class() -function BoundMember:init(parent, name, field) +function M.BoundMember:init(parent, name, field) local pmt = getmetatable(parent) local mt = {} @@ -45,9 +45,9 @@ function BoundMember:init(parent, name, field) end -TreeNode = class() +M.TreeNode = class() -function TreeNode:init(context) +function M.TreeNode:init(context) local mt = getmetatable(self) util.update(mt, context) @@ -75,13 +75,13 @@ function TreeNode:init(context) if ({create=true, delete=true})[permission] then permission = 'modify' end - return has_permission(mt.parent, user, permission) + return M.has_permission(mt.parent, user, permission) end mt.txn.validable[mt.path] = mt.addr end -function TreeNode:fetch(path, create) +function M.TreeNode:fetch(path, create) if type(path) == 'string' then path = pth.split(path) end if #path == 0 then return self end @@ -102,10 +102,10 @@ function TreeNode:fetch(path, create) raise(pth.join(mt.path, name), 'Is a primitive value') end - return TreeNode.fetch(next, path, create) + return M.TreeNode.fetch(next, path, create) end -function TreeNode:search_refs(path) +function M.TreeNode:search_refs(path) if type(path) == 'string' then path = pth.split(path) end if #path == 0 then return {} end @@ -121,7 +121,7 @@ function TreeNode:search_refs(path) local member = mt.member(name) if member.deleted then return {member} end - return isinstance(next, TreeNode) and TreeNode.search_refs( + return isinstance(next, M.TreeNode) and M.TreeNode.search_refs( next, path ) or {} end @@ -138,22 +138,22 @@ function TreeNode:search_refs(path) end -Collection = class(TreeNode) +M.Collection = class(M.TreeNode) -function Collection:init(context, params) - super(self, Collection):init(context) +function M.Collection:init(context, params) + super(self, M.Collection):init(context) self.init = nil self.fetch = nil self.search_refs = nil local mt = getmetatable(self) - local field = BoundMember(self, pth.wildcard, params.field) + local field = M.BoundMember(self, pth.wildcard, params.field) function mt.topology() return field:topology() end function mt.member(name) - return BoundMember(self, name, params.field) + return M.BoundMember(self, name, params.field) end function mt.load(k, create) return mt.member(k):load(create) end @@ -189,10 +189,10 @@ function Collection:init(context, params) end -List = class(Collection) +M.List = class(M.Collection) -function List:init(context, params) - super(self, List):init(context, params) +function M.List:init(context, params) + super(self, M.List):init(context, params) local mt = getmetatable(self) mt.meta.type = 'list' @@ -220,10 +220,10 @@ end -- experimental -Mixed = class(Collection) +M.Mixed = class(M.Collection) -function Mixed:init(context, params) - super(self, Mixed):init(context, params) +function M.Mixed:init(context, params) + super(self, M.Mixed):init(context, params) -- TODO dynamic meta: list non-leaf children local mt = getmetatable(self) @@ -242,27 +242,17 @@ local function meta_func(attr) end end -addr = meta_func('addr') -has_permission = meta_func('has_permission') -insert = meta_func('insert') -members = meta_func('members') -meta = meta_func('meta') -mmeta = meta_func('mmeta') -parent = meta_func('parent') -path = meta_func('path') -topology = meta_func('topology') -validate = meta_func('validate') +for _, mf in ipairs{ + 'addr', 'has_permission', 'insert', 'meta', 'mmeta', 'path', 'topology' +} do M[mf] = meta_func(mf) end -local rawpairs = pairs -local rawipairs = ipairs - -function pairs(tbl) - if not isinstance(tbl, TreeNode) then return rawpairs(tbl) end +function M.pairs(tbl) + if not isinstance(tbl, M.TreeNode) then return pairs(tbl) end local mt = getmetatable(tbl) local res = {} - for _, member in rawipairs(mt.members()) do res[member] = mt.load(member) end - return rawpairs(res) + for _, member in ipairs(mt.members()) do res[member] = mt.load(member) end + return pairs(res) end local function _ipairs(mt, i) @@ -271,7 +261,10 @@ local function _ipairs(mt, i) if v == nil then return end return i, v end -function ipairs(tbl) - if not isinstance(tbl, TreeNode) then return rawipairs(tbl) end +function M.ipairs(tbl) + if not isinstance(tbl, M.TreeNode) then return ipairs(tbl) end return _ipairs, getmetatable(tbl), 0 end + + +return M |