Class: Apricot::Namespace

Inherits:
Module
  • Object
show all
Defined in:
lib/apricot/namespace.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeNamespace

Returns a new instance of Namespace.



21
22
23
24
25
# File 'lib/apricot/namespace.rb', line 21

def initialize
  @vars = {}
  @fns = Set[]
  @aliases = {}
end

Instance Attribute Details

#aliasesObject (readonly)

Returns the value of attribute aliases.



19
20
21
# File 'lib/apricot/namespace.rb', line 19

def aliases
  @aliases
end

#fnsObject (readonly)

Returns the value of attribute fns.



19
20
21
# File 'lib/apricot/namespace.rb', line 19

def fns
  @fns
end

#varsObject (readonly)

Returns the value of attribute vars.



19
20
21
# File 'lib/apricot/namespace.rb', line 19

def vars
  @vars
end

Class Method Details

.find_or_create(constant) ⇒ Object

Raises:

  • (TypeError)


3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 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

Instance Method Details

#add_alias(name, ns) ⇒ Object



58
59
60
# File 'lib/apricot/namespace.rb', line 58

def add_alias(name, ns)
  @aliases[name] = ns
end

#get_var(name) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
56
# 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) ⇒ Boolean

Returns:

  • (Boolean)


62
63
64
# File 'lib/apricot/namespace.rb', line 62

def has_var?(name)
  @vars.has_key?(name) || @aliases.has_key?(name)
end

#set_var(name, val) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 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