diff --git a/lib/level.js b/lib/level.js index 49a07ef1..ead10bbd 100644 --- a/lib/level.js +++ b/lib/level.js @@ -4,6 +4,7 @@ var PATH = require('./path'), FS = require('fs'), INHERIT = require('inherit'), createTech = require('./tech').createTech, + U = require('util'), bemUtil = require('./util'), LOGGER = require('./logger'), isRequireable = bemUtil.isRequireable, @@ -19,13 +20,32 @@ var PATH = require('./path'), return BEM; }, - getLevelClass = function(path, optional) { - var level = optional && !isRequireable(path) ? {} : requireLevel(path); + getLevelClass = function(path, optional, stack) { + stack = stack || []; + + var level; + try { + level = optional && !isRequireable(path) ? {} : requireLevel(path); + } catch(error) { + throw new Error(U.format( + 'level module %s can not be found %s %s%s\n', + path, + stack.length > 0? 'but required by the level': '', + stack.length > 1? 'inheritance tree:\n\t': '', + stack.join('\n\t'))); + } + + stack.push(path); if (typeof level === 'function') level = level(getBem()); if (level.Level) return level.Level; - return INHERIT(level.baseLevelPath? getLevelClass(level.baseLevelPath) : Level, level); + + var baseLevelPath = (level.baseLevelName? + PATH.join(__dirname, 'levels', level.baseLevelName): + null) || level.baseLevelPath; + + return INHERIT(baseLevelPath? getLevelClass(baseLevelPath, false, stack) : Level, level); }, requireLevel = function(path) {