Sha256: 612618ed0edf59309395ae7e4c3e8b10f2227a5e5081cf9a2799d3c76dc46949

Contents?: true

Size: 1.15 KB

Versions: 1

Compression:

Stored size: 1.15 KB

Contents

module Aquarium
  module Utils
    module TypeUtils
      def self.is_type? type_or_object
        type_or_object.kind_of?(Class) or type_or_object.kind_of?(Module)
      end

      def self.descendents clazz
        visited_types = [Class, Object, Module, clazz]
        result = Module.constants.inject([clazz]) do |result, const|
          mod = Module.class_eval(const)
          if mod.respond_to?(:ancestors)
            result << mod if mod.ancestors.include?(clazz)
            do_descendents clazz, mod, visited_types, result
          end
          result
        end
        result.uniq
      end
      
      protected
      
      def self.do_descendents clazz, visiting_module, visited, result
        visited << visiting_module
        visiting_module.constants.each do |const|
          next unless visiting_module.const_defined?(const)
          clazz2 = visiting_module.const_get(const)
          next if visited.include?(clazz2) or not clazz2.respond_to?(:ancestors)
          visited << clazz2
          result << clazz2 if clazz2.ancestors.include?(clazz)
          do_descendents clazz, clazz2, visited, result 
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
aquarium-0.3.1 lib/aquarium/utils/type_utils.rb