Load formulae into private namespace

This commit is contained in:
Jack Nagel 2015-01-01 01:21:59 -05:00
parent 8ab4b9ae55
commit a2a24b3a0d

View File

@ -2,22 +2,43 @@
# It is not meant to be used directy from formulae.
class Formulary
module Formulae
class << self
if instance_method(:const_defined?).arity == -1
def formula_const_defined?(name)
const_defined?(name, false)
end
def formula_const_get(name)
const_get(name, false)
end
else
def formula_const_defined?(name)
const_defined?(name)
end
def formula_const_get(name)
const_get(name)
end
end
def remove_formula_const(name)
remove_const(name)
end
def formula_const_set(name, value)
const_set(name, value)
end
end
end
def self.unload_formula formula_name
Object.send(:remove_const, class_s(formula_name))
end
def self.formula_class_defined? class_name
Object.const_defined?(class_name)
end
def self.get_formula_class class_name
Object.const_get(class_name)
Formulae.remove_formula_const(class_s(formula_name))
end
def self.restore_formula formula_name, value
old_verbose, $VERBOSE = $VERBOSE, nil
Object.const_set(class_s(formula_name), value)
Formulae.formula_const_set(class_s(formula_name), value)
ensure
$VERBOSE = old_verbose
end
@ -50,11 +71,9 @@ class Formulary
klass.new(name, path, spec)
end
# Return the Class for this formula, `require`-ing it if
# it has not been parsed before.
def klass
begin
have_klass = Formulary.formula_class_defined? class_name
have_klass = Formulae.formula_const_defined?(class_name)
rescue NameError => e
raise unless e.name.to_s == class_name
raise FormulaUnavailableError, name, e.backtrace
@ -62,11 +81,7 @@ class Formulary
load_file unless have_klass
klass = Formulary.get_formula_class(class_name)
if klass == Formula || !(klass < Formula)
raise FormulaUnavailableError.new(name)
end
klass
Formulae.formula_const_get(class_name)
end
private
@ -74,7 +89,7 @@ class Formulary
def load_file
STDERR.puts "#{$0} (#{self.class.name}): loading #{path}" if ARGV.debug?
raise FormulaUnavailableError.new(name) unless path.file?
require(path)
Formulae.module_eval(path.read, path)
end
end