summaryrefslogtreecommitdiffstats
path: root/aconf/model
diff options
context:
space:
mode:
authorKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2015-01-23 23:55:37 +0200
committerKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2015-01-23 23:55:37 +0200
commit27fec74655c9e6a3004d2b606724375f85b05697 (patch)
treec5fab1b97c136f9bbba200d58acb18e8c1caa6fa /aconf/model
parent6821eddbd05f92957b87c6dc775e229841af8e11 (diff)
downloadaconf-27fec74655c9e6a3004d2b606724375f85b05697.tar.bz2
aconf-27fec74655c9e6a3004d2b606724375f85b05697.tar.xz
model: auto-instantiate collection key field
Diffstat (limited to 'aconf/model')
-rw-r--r--aconf/model/init.lua3
-rw-r--r--aconf/model/model.lua21
-rw-r--r--aconf/model/node.lua4
3 files changed, 10 insertions, 18 deletions
diff --git a/aconf/model/init.lua b/aconf/model/init.lua
index acdf7f3..663c7f8 100644
--- a/aconf/model/init.lua
+++ b/aconf/model/init.lua
@@ -254,8 +254,7 @@ function M.Set.save_member(tn, k, v) node.insert(tn, v) end
M.Mixed = class(M.Collection)
function M.Mixed:init(params)
- params.type = M.Mixed
- super(self, M.Mixed):init(params, node.Mixed)
+ super(self, M.Mixed):init(update(params, {type=M.Mixed}), node.Mixed)
self.pfield = Field()
end
diff --git a/aconf/model/model.lua b/aconf/model/model.lua
index 153281f..8ad2cda 100644
--- a/aconf/model/model.lua
+++ b/aconf/model/model.lua
@@ -26,22 +26,15 @@ local pth = require('aconf.path')
local util = require('aconf.util')
local copy = util.copy
local map = util.map
+local update = util.update
-local function to_member(obj, params)
- if not params then params = {} end
+function M.to_field(obj, params, cls)
if object.issubclass(obj, M.Model) then
- params.model = obj
- return Model(params)
+ return Model(update(params, {model=obj}))
end
- local res = getmetatable(obj).class and obj or obj(params)
- assert(isinstance(res, Member))
- return res
-end
-
-function M.to_field(obj, params)
- local res = to_member(obj, params)
- assert(isinstance(res, Field))
+ local res = object.toinstance(obj, params)
+ assert(isinstance(res, cls or Field))
return res
end
@@ -88,7 +81,7 @@ function M.new(base)
k = normalize_name(k)
local override = t[k]
- if type(v) == 'table' then v = to_member(v) end
+ if type(v) == 'table' then v = M.to_field(v, nil, Member) end
rawset(t, k, v)
@@ -209,7 +202,7 @@ function M.Model:init(context)
end
function mt.init_meta(meta)
- util.update(
+ update(
meta,
{
fields=tmeta(Field),
diff --git a/aconf/model/node.lua b/aconf/model/node.lua
index 80f1de0..0b4d36d 100644
--- a/aconf/model/node.lua
+++ b/aconf/model/node.lua
@@ -1,5 +1,5 @@
--[[
-Copyright (c) 2012-2014 Kaarle Ritvanen
+Copyright (c) 2012-2015 Kaarle Ritvanen
See LICENSE file for license details
--]]
@@ -337,7 +337,7 @@ function M.Collection:init(context, params)
end
if params.key then
- local kf = M.BoundMember(self, k, params.key)
+ local kf = M.BoundMember(self, k, object.toinstance(params.key))
if kf:normalize(k) ~= k then
raise(mt.path, 'Invalid member name: '..k)
end