+ if object:scheme('depends') then
+ local ok = true
+ local valid = false
+
+ for _, dep in ipairs(object:scheme('depends')) do
+ local subcondition = true
+ for k, v in pairs(dep) do
+ -- XXX: better error
+ local ref = _parse_reference( k, unpack(object.cref) )
+
+ if not ref then
+ return false, derr:child(ERR.SME_BADDEP(object,k))
+ end
+
+ local option = uvl.option( self, object.c, unpack(ref) )
+
+ valid, err = self:_validate_option( option, true )
+ if valid then
+ if not (
+ ( type(v) == "boolean" and option:value() ) or
+ ( ref[3] and option:value() ) == v
+ ) then
+ subcondition = false
+
+ local depstr = _serialize_dependency( dep, v )
+ derr:child(
+ type(v) == "boolean"
+ and ERR.DEP_NOVALUE(option, depstr)
+ or ERR.DEP_NOTEQUAL(option, {depstr, v})
+ )
+
+ break
+ end
+ else
+ subcondition = false
+
+ local depstr = _serialize_dependency( dep, v )
+ derr:child(ERR.DEP_NOTVALID(option, depstr):child(err))
+
+ break
+ end
+ end
+
+ if subcondition then
+ ok = true
+ break
+ else
+ ok = false
+ end
+ end