require 'name_utils' class OneInstancePluginLoader attr_reader :baseClass, :pluginDir, :classes def initialize (baseClass, dir) @pluginDir = dir @baseClass = baseClass @classes = Hash.new if baseClass.kind_of? String className = baseClass.gsub('^([a-zA-Z]+).*', '\1') @baseClass = eval className end end def avail_plugins list = Array.new Dir.open(@pluginDir).each do |f| list << NameUtils.filename_to_class(f) unless f =~ /^\./ end list end =begin --- plugin (c) Returns an object of the type ((|c|)). It loads the class if necessary. =end def plugin (c) return @classes[c] if @classes[c] fileName = NameUtils.class_to_filename c begin require pluginDir + '/' + fileName safeClassname = eval(c.gsub('^([a-zA-Z]+).*', '\1')) rescue LoadError raise "Can't find plugin #{c} (file '#{fileName}'). Hint: Bad classname?" end obj = safeClassname.new raise "#{c} is not a #{@baseClass} type plugin" unless obj.kind_of? @baseClass @classes[c] = obj end =begin --- plugin_by_index (i) Returns an object of the type of the plugin whose index in the avail_plugins array is ((|i|)). It loads the class if necessary. =end def plugin_by_index (i) plugin(avail_plugins[i]) end end