178: def component_class_get type, name, options={}
179: case name
180: when ::Class
181: return name
182: else
183: mod_name = nil
184: target_name = nil
185: if name =~ /\A\+([\w:]+)\z/
186: target_name = $1
187: mod_name = [ self, type.capitalize, target_name ].join("::")
188: else
189: mod_name = name
190: end
191: begin
192: return nested_const_get(mod_name)
193: rescue NameError => e
194: begin
195: if options[:plugin_dir]
196: options[:plugin_dir].each do |path|
197: begin
198: begin
199: self.const_get(type.capitalize).autoload(name, File.expand_path(File.join(path, module2path(target_name))))
200: rescue LoadError => e
201: raise ::ClassX::Pluggable::PluginLoadError, "class: #{mod_name} is not found"
202: end
203: return nested_const_get(mod_name)
204: rescue NameError => e
205: next
206: end
207: raise NameError, "must not happened unless your code is something wrong!!"
208: end
209: else
210: nested_autoload(mod_name, module2path(mod_name))
211: nested_const_get mod_name
212: end
213: rescue LoadError => e
214: raise ::ClassX::Pluggable::PluginLoadError, "class: #{mod_name} is not found."
215: end
216: end
217: end
218: end