module Interop

Constants

DEBUG

Public Class Methods

cleanly_load(targets, opts) click to toggle source
# File lib/modules/interop.rb, line 23
def self.cleanly_load(targets, opts)
  DEBUG.call "Package definitions #{targets}"
  result = wrap_constants(targets)
  if !opts[:save_the_environment]
    result.each_pair do |key, value|
      Object.send(:remove_const, key.to_sym) unless key.include?('::')
    end
  end

  result
end
import(id, opts={}) click to toggle source
# File lib/modules/interop.rb, line 11
def self.import(id, opts={})
  if @cache.include?(id)
    DEBUG.call "Cache hit #{id}"
    return @cache[id]
  end

  DEBUG.call "Load #{id}"
  snapshot = Module.constants
  require id
  cleanly_load(Module.constants - snapshot, opts)
end
wrap_constants(new, result={}, visited=Set.new) click to toggle source
# File lib/modules/interop.rb, line 35
def self.wrap_constants(new, result={}, visited=Set.new)
  if new.length == 0
    return result
  end

  str = new.pop().to_s
  const = eval str
  if const.nil?
    return wrap_constants(new, result)
  end

  if const.respond_to? :constants
    children = const
      .constants
      .reject {|element| visited.include?(element)}
      .map {|child|
        visited.add(child)
        "#{str}::#{child.to_s}"
      }

    new += children
  end

  if const.class == Module
    const.private_instance_methods.each {|method| const.send(:public, method)}
    result[str] = Class.new.extend(const)
  else
    result[str] = const
  end

  return wrap_constants(new, result, visited)
end