Class: ConstLookup

Inherits:
Object
  • Object
show all
Defined in:
lib/const_lookup.rb,
lib/const_lookup/version.rb,
lib/const_lookup/core_ext.rb

Defined Under Namespace

Modules: CoreExt

Constant Summary collapse

VERSION =
'0.6.0'.freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(namespace) ⇒ ConstLookup

Returns a new instance of ConstLookup.

Raises:

  • (ArgumentError)


8
9
10
11
# File 'lib/const_lookup.rb', line 8

def initialize namespace
  raise ArgumentError, 'namespace must be a Module' unless namespace.is_a? Module
  @namespace = namespace.to_s
end

Class Method Details

.lookup(name, namespace = Object) ⇒ Object



4
5
6
# File 'lib/const_lookup.rb', line 4

def self.lookup name, namespace = Object
  new(namespace).lookup(name)
end

Instance Method Details

#lookup(name) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
# File 'lib/const_lookup.rb', line 13

def lookup name
  name = name.to_sym
  constant = lookup_path.select do |namespace|
    namespace.const_defined? name
  end.map do |namespace|
    namespace.const_get name
  end.sort_by do |constant|
    -constant.to_s.split('::').size
  end.first
  constant or raise NameError, "Failed to find `#{name}' in #@namespace"
end

#lookup_pathObject



25
26
27
28
29
30
31
32
33
# File 'lib/const_lookup.rb', line 25

def lookup_path
  @namespace.split('::').reduce([]) do |lookup_path, part|
    lookup_path << [*lookup_path.last, part]
  end.map do |parts|
    parts.join '::'
  end.map do |name|
    namespaced_const_get name
  end.reverse
end