Class Library::Loader
In: lib/library.rb
Parent: Object

class which implements logic of searching/loading versioned libraries

Methods
globs    link    load    loaded?    loaded_features    new   
Attributes
:absolute  [R] 
:loaded  [R] 
:sep  [R] 
Included modules
Singleton
Public Class methods
new()
# File lib/library.rb, line 176
    def initialize
      @loaded = {}
      @sep = File::SEPARATOR
      @absolute = }^\s*#{sep}}o
    end
Public Instance methods
link(filename, interface=nil)
# File lib/library.rb, line 182
    def link filename, interface=nil 
      return false if loaded? (filename, interface)

      self.load filename, interface
    end
load(filename, interface=nil)
# File lib/library.rb, line 188
    def load filename, interface=nil 
      fn = nil
      v = nil

      if interface
	fn = filename
	v = Version.new(interface)
      else
	fn, v = Version.parse(filename)
      end

      entries = []
      globs(fn).each do |glob|
	Dir[glob].map do |path|
	  entries << Entry.new(path, Version.new(path))
	end
      end

      entries.sort! {|a,b| a.version <=> b.version}
      entries.reverse!

      entries.each do |entry|
	if entry.version === v
	  Kernel::load(entry.path)
	  return (loaded[[filename, interface]] = entry.path)
	end
      end

      msg = "INTERFACE #{interface}\nNOT SUPPORTED BY ANY OF\n"
      entries.each {|e| msg << "\t#{e.path} [#{e.version}\]\n"}
      raise msg 
    end
globs(filename)
# File lib/library.rb, line 221
    def globs filename
      fn = filename.clone
      ext = fn[}\.[^\.]+$}o]
      globs = []

      if ext
	globs << "#{fn}.[0-9].[0-9].[0-9]"
      else
	globs << "#{fn}.rb.[0-9].[0-9].[0-9]"
	globs << "#{fn}.so.[0-9].[0-9].[0-9]"
      end

      if fn =~ absolute
	return globs
      else
	return \
	  $LOAD_PATH.collect do |path|
	    globs.map {|glob| path.clone << sep << glob }
	  end.flatten
      end
    end
loaded_features()
# File lib/library.rb, line 243
    def loaded_features
      loaded.values
    end
loaded?(filename, interface)
# File lib/library.rb, line 247
    def loaded? filename, interface
      loaded[[filename, interface]]
    end