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