# encoding: utf-8 # require 'singleton' module BuildTool class ConfigurationError < Exception end class ModuleRegistry include Singleton include MJ::Configuration::Configurable include Singleton @@packages = {} def set( name, string ) @@packages[name] = string.to_s.split( / */ ) end def self.resolve_package( string, &block ) name = string[1..-1] if @@packages.has_key? name return self.get_modules( @@packages[name], &block ) else $log.error( "Unknown package #{string}" ) end end @@modules = [] def register_module( mod ) if self.class.module_by_name mod.name raise ConfigurationError, "Two configurations for #{mod.name} found" end @@modules.push( [mod.name ,mod] ) end def self.module_by_name( name ) @@modules.each do |v| if v[0] == name return v[1] end end nil end def self.get_modules( args, &block ) if args.instance_of?( String ) if args[0,1] == ':' self.resolve_package( args, &block ) # Check if we have a exact match elsif mod = module_by_name(args) yield mod elsif args[-1,1] == '/' found = false @@modules.select{ |a| a[0].index(args) == 0}.each do |a| found = true yield a[1] end $log.error( "Unknown module #{args}" ) if !found else $log.error( "Unknown module #{args}" ) end elsif args.instance_of?( Array ) args.map { |arg| get_modules( arg, &block ) } end end end YAML.add_domain_type( "michael-jansen.biz,2009", "Packages" ) { |type, val| mr = ModuleRegistry.instance MJ::Configuration::flatten_values val do |k, v| mr.set( k, v ) end } end