| Module | Aquarium::Utils::TypeUtils |
| In: |
lib/aquarium/utils/type_utils.rb
|
# File lib/aquarium/utils/type_utils.rb, line 8
8: def self.descendents clazz
9: visited = [Class, Object, Module, clazz]
10: result = [clazz]
11: Module.constants.each do |const|
12: mod = Module.class_eval(const)
13: if mod.respond_to?(:ancestors)
14: result << mod if mod.ancestors.include?(clazz)
15: do_descendents clazz, mod, visited, result
16: end
17: end
18: result.uniq
19: end
# File lib/aquarium/utils/type_utils.rb, line 4 4: def self.is_type? type_or_object 5: type_or_object.kind_of?(Class) or type_or_object.kind_of?(Module) 6: end
# File lib/aquarium/utils/type_utils.rb, line 21
21: def self.nested clazz
22: result = [clazz]
23: clazz.constants.each do |const|
24: mod = clazz.class_eval(const)
25: next unless is_type?(mod)
26: result << mod
27: result << nested(mod)
28: end
29: result.flatten.uniq
30: end
For JRuby classes, we have to "x" forms of the reflection methods that don‘t end in ’?’. That includes "send", so we do some ugly switching, rather than call "mod.send(method_name)" or "mod.send(method_name)"!
# File lib/aquarium/utils/type_utils.rb, line 37
37: def self.do_descendents clazz, visiting_module, visited, result
38: visited << visiting_module
39: use_underscore_methods = use_underscore_methods? visiting_module
40: nested_constants = use_underscore_methods ? visiting_module.__constants__ : visiting_module.constants
41: nested_constants.each do |const|
42: next unless visiting_module.const_defined?(const)
43: nested_module = use_underscore_methods ? visiting_module.__const_get__(const) : visiting_module.const_get(const)
44: next if visited.include?(nested_module)
45: next unless responds_to_ancestors?(nested_module)
46: use_underscore_methods2 = use_underscore_methods? nested_module
47: modules_ancestors = use_underscore_methods2 ? nested_module.__ancestors__ : nested_module.ancestors
48: result << nested_module if modules_ancestors.include?(clazz)
49: do_descendents clazz, nested_module, visited, result
50: end
51: end
# File lib/aquarium/utils/type_utils.rb, line 57
57: def self.responds_to_ancestors? mod
58: mod.respond_to?(:ancestors) or mod.respond_to?(:__ancestors__)
59: end