+--- Object representation of an uvl item - base class.
+uvlitem = luci.util.class()
+
+function uvlitem.cid(self)
+ if #self.cref == 1 then
+ return self.cref[1]
+ else
+ local r = { unpack(self.cref) }
+ local c = self.c
+ if c and c[r[2]] and c[r[2]]['.anonymous'] and c[r[2]]['.index'] then
+ r[2] = '@' .. c[r[2]]['.type'] ..
+ '[' .. tostring(c[r[2]]['.index']) .. ']'
+ end
+ return table.concat( r, '.' )
+ end
+end
+
+function uvlitem.sid(self)
+ return table.concat( self.sref, '.' )
+end
+
+function uvlitem.scheme(self, opt)
+ local s
+
+ if #self.sref == 4 or #self.sref == 3 then
+ s = self.s and self.s.packages
+ s = s and s[self.sref[1]]
+ s = s and s.variables
+ s = s and s[self.sref[2]]
+ s = s and s[self.sref[3]]
+ elseif #self.sref == 2 then
+ s = self.s and self.s.packages
+ s = s and s[self.sref[1]]
+ s = s and s.sections
+ s = s and s[self.sref[2]]
+ else
+ s = self.s and self.s.packages
+ s = s and s[self.sref[1]]
+ end
+
+ if s and opt then
+ return s[opt]
+ elseif s then
+ return s
+ end
+end
+
+function uvlitem.config(self, opt)
+ local c
+
+ if #self.cref == 4 or #self.cref == 3 then
+ c = self.c and self.c[self.cref[2]] or nil
+ c = c and c[self.cref[3]] or nil
+ elseif #self.cref == 2 then
+ c = self.c and self.c[self.cref[2]] or nil
+ else
+ c = self.c
+ end
+
+ if c and opt then
+ return c[opt]
+ elseif c then
+ return c
+ end
+end
+
+function uvlitem.title(self)
+ return self:scheme() and self:scheme('title') or
+ self.cref[3] or self.cref[2] or self.cref[1]
+end
+
+function uvlitem.type(self)
+ if self.t == luci.uvl.TYPE_CONFIG then
+ return 'config'
+ elseif self.t == luci.uvl.TYPE_SECTION then
+ return 'section'
+ elseif self.t == luci.uvl.TYPE_OPTION then
+ return 'option'
+ elseif self.t == luci.uvl.TYPE_ENUM then
+ return 'enum'
+ end
+end
+
+function uvlitem.error(self, ...)
+ if not self.e then
+ local errconst = { ERR.CONFIG, ERR.SECTION, ERR.OPTION, ERR.OPTION }
+ self.e = errconst[#self.cref]( self )
+ end
+
+ return self.e:child( ... )
+end
+
+function uvlitem.errors(self)
+ return self.e
+end
+
+function uvlitem.ok(self)
+ return not self:errors()
+end
+
+function uvlitem.parent(self)
+ if self.p then
+ return self.p
+ elseif #self.cref == 3 or #self.cref == 4 then
+ return luci.uvl.section( self.s, self.c, self.cref[1], self.cref[2] )
+ elseif #self.cref == 2 then
+ return luci.uvl.config( self.s, self.c, self.cref[1] )
+ else
+ return nil
+ end
+end
+
+function uvlitem._loadconf(self, co, c)
+ if not co then
+ local uci, err = luci.model.uci.cursor(), nil
+ co, err = uci:get_all(c)
+
+ if err then
+ self:error(ERR.UCILOAD(self, err))
+ end
+ end
+ return co
+end
+
+
+--- Object representation of a scheme.
+-- @class scheme