module Aquarium::Utils::TypeUtils

Public Class Methods

descendents(clazz) click to toggle source
# File lib/aquarium/utils/type_utils.rb, line 10
def self.descendents clazz
  visited = Set.new([Class, Object, Module, clazz])
  if RUBY_VERSION =~ /^1.9/
    visited << BasicObject 
  end
  result = [clazz]
  Module.constants.each do |const|
    mod = Module.class_eval(const.to_s)
    if mod.respond_to?(:ancestors)
      result << mod if mod.ancestors.include?(clazz)
      do_descendents clazz, mod, visited, result
    end
  end
  result.uniq
end
is_type?(type_or_object) click to toggle source
# File lib/aquarium/utils/type_utils.rb, line 6
def self.is_type? type_or_object
  type_or_object.kind_of?(Class) or type_or_object.kind_of?(Module)
end
nested(clazz) click to toggle source
# File lib/aquarium/utils/type_utils.rb, line 26
def self.nested clazz
  result = [clazz]
  clazz.constants.each do |const|
    mod = clazz.class_eval(const.to_s)
    next unless is_type?(mod)
    result << mod 
    result << nested(mod)
  end
  result.flatten.uniq
end

Protected Class Methods

do_descendents(clazz, visiting_module, visited, result) click to toggle source

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)”! TODO: is this still true with the latest JRUBY versions?

# File lib/aquarium/utils/type_utils.rb, line 43
def self.do_descendents clazz, visiting_module, visited, result
  visited << visiting_module
  use_underscore_methods = use_underscore_methods? visiting_module
  nested_constants = use_underscore_methods ? visiting_module.__constants__ : visiting_module.constants
  nested_constants.each do |const|
    next unless visiting_module.const_defined?(const)
    nested_module = ignore_warning do
      use_underscore_methods ? visiting_module.__const_get__(const) : visiting_module.const_get(const)
    end
    next if visited.include?(nested_module)
    next unless responds_to_ancestors?(nested_module)
    use_underscore_methods2 = use_underscore_methods? nested_module
    modules_ancestors = use_underscore_methods2 ? nested_module.__ancestors__ : nested_module.ancestors
    result << nested_module if modules_ancestors.include?(clazz)
    do_descendents clazz, nested_module, visited, result 
  end
end
ignore_warning() { || ... } click to toggle source
# File lib/aquarium/utils/type_utils.rb, line 69
def self.ignore_warning
  warning_orig = $-w
  $-w = nil
  res = yield
  $-w = warning_orig
  return res
end
responds_to_ancestors?(mod) click to toggle source
# File lib/aquarium/utils/type_utils.rb, line 65
def self.responds_to_ancestors? mod
  mod.respond_to?(:ancestors) or mod.respond_to?(:__ancestors__)
end
use_underscore_methods?(mod) click to toggle source
# File lib/aquarium/utils/type_utils.rb, line 61
def self.use_underscore_methods? mod
  mod.respond_to?(:__constants__)
end