Module: Polyglot

Defined in:
lib/polyglot/version.rb,
lib/polyglot.rb

Overview

:nodoc:

Defined Under Namespace

Modules: VERSION Classes: NestedLoadError, PolyglotLoadError

Class Method Summary collapse

Class Method Details

.find(file, *options, &block) ⇒ Object


25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/polyglot.rb', line 25

def self.find(file, *options, &block)
  is_absolute = Pathname.new(file).absolute?
  is_dot_relative = file =~ /\.[\/\\]/
  paths = is_absolute ? [''] : Array(is_dot_relative ? '.' : nil) + $:
  paths.each do |lib|
    base = is_absolute ? "" : lib+File::SEPARATOR
    # In Windows, repeated SEPARATOR chars have a special meaning, avoid adding them
    matches = Dir["#{base}#{file}{,.#{@registrations.keys*',.'}}"]
    # Revisit: Should we do more do if more than one candidate found?
    $stderr.puts "Polyglot: found more than one candidate for #{file}: #{matches*", "}" if matches.size > 1
    if path = matches[0]
      return [ path, @registrations[path.gsub(/.*\./,'')]]
    end
  end
  return nil
end

.load(*a, &b) ⇒ Object


42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/polyglot.rb', line 42

def self.load(*a, &b)
  file = a[0].to_s
  return if @loaded[file] # Check for $: changes or file time changes and reload?
  begin
    source_file, loader = Polyglot.find(file, *a[1..-1], &b)
    if (loader)
      begin
        loader.load(source_file)
        @loaded[file] = true
      rescue LoadError => e
        raise Polyglot::NestedLoadError.new(e)
      end
    else
      raise PolyglotLoadError.new("Failed to load #{file} using extensions #{(@registrations.keys+["rb"]).sort*", "}")
    end
  end
end

.register(extension, klass) ⇒ Object


18
19
20
21
22
23
# File 'lib/polyglot.rb', line 18

def self.register(extension, klass)
  extension = [extension] unless Array === extension
  extension.each{|e|
    @registrations[e] = klass
  }
end