class Apricot::Namespace
Attributes
aliases[R]
fns[R]
vars[R]
Public Class Methods
find_or_create(constant)
click to toggle source
# File lib/apricot/namespace.rb, line 3 def self.find_or_create(constant) ns = constant.const_names.reduce(Object) do |mod, name| if mod.const_defined? name next_mod = mod.const_get name raise TypeError, "#{mod}::#{name} (#{next_mod}) is not a Module" unless next_mod.is_a? Module next_mod else mod.const_set(name, Namespace.new) end end raise TypeError, "#{constant.name} is not a Namespace" unless ns.is_a? Namespace ns end
new()
click to toggle source
# File lib/apricot/namespace.rb, line 21 def initialize @vars = {} @fns = Set[] @aliases = {} end
Public Instance Methods
add_alias(name, ns)
click to toggle source
# File lib/apricot/namespace.rb, line 58 def add_alias(name, ns) @aliases[name] = ns end
get_var(name)
click to toggle source
# File lib/apricot/namespace.rb, line 43 def get_var(name) # raise may be a function defined on the namespace so we need to # explicitly call the Ruby raise method. Kernel.raise NameError, "Undefined variable '#{name}' on #{self}" unless has_var? name if var = @vars[name] var elsif ns = @aliases[name] ns.get_var(name) else nil end end
has_var?(name)
click to toggle source
# File lib/apricot/namespace.rb, line 62 def has_var?(name) @vars.has_key?(name) || @aliases.has_key?(name) end
set_var(name, val)
click to toggle source
# File lib/apricot/namespace.rb, line 27 def set_var(name, val) @vars[name] = val val = val.to_proc if val.is_a? Method if val.is_a?(Proc) && (@fns.include?(name) || !self.respond_to?(name)) @fns.add name define_singleton_method(name, val) elsif @fns.include?(name) @fns.delete name singleton_class.send(:undef_method, name) end val end