302: def requireDerivative( modName )
303:
304:
305:
306: if ( self.respond_to?(:derivativeDirs) )
307: subdirs = self.derivativeDirs
308: subdirs = [ subdirs ] unless subdirs.is_a?( Array )
309:
310:
311: else
312: subdirs = ['']
313: end
314:
315: fatals = []
316:
317:
318:
319: catch( :found ) {
320: subdirs.collect {|dir| dir.strip}.each do |subdir|
321: self.makeRequirePath( modName, subdir ).each {|path|
322:
323:
324:
325:
326: begin
327: require( path.untaint )
328: rescue LoadError => err
329: PluginFactory::log :debug,
330: "No module at '%s', trying the next alternative: '%s'" %
331: [ path, err.message ]
332: rescue ScriptError,StandardError => err
333: fatals << err
334: PluginFactory::log :error,
335: "Found '#{path}', but encountered an error: %s\n\t%s" %
336: [ err.message, err.backtrace.join("\n\t") ]
337: else
338:
339:
340: throw :found
341: end
342: }
343: end
344:
345:
346:
347:
348:
349: if ! fatals.empty?
350:
351: Kernel::raise( fatals.first )
352: end
353:
354: nil
355: }
356: end