Module ModuleExtensions::Hierarchy
In: lib/module_extensions/hierarchy.rb

Extend the Module class with methods to manipulate inheritance relation between constants of a module.

Methods

Classes and Modules

Class ModuleExtensions::Hierarchy::HierarchyTest

Public Instance methods

Remove a class from the hierarchy using remove_const. Sub classes of this class are also removed. It returns an array of the removed class name. See sub_classes for a description of the recursive argument.

[Source]

# File lib/module_extensions/hierarchy.rb, line 36
    def remove_class(base_class, recursive=false)
      subs = sub_classes(base_class, true, recursive)
      re = /^#{name}::/
      result = []
      subs.each do |sub|
        sub_name = sub.to_s.sub!(re, '')
        if sub_name =~ /^(.+)::(.+)$/
          const_get($1).module_eval { remove_const($2.to_sym) }
        else
          remove_const(sub_name.to_sym)
        end
        result << sub_name
      end
      result
    end

Return the list of all sub classes of base_class (including itself). If force_autoload is false, not yet loaded constants will be ignored. If recursive is true sub modules will also be traversed.

[Source]

# File lib/module_extensions/hierarchy.rb, line 15
    def sub_classes(base_class, force_autoload=false, recursive=false)
      check_const_is_class?(base_class)
      result = []
      constants.each do |const_name|
        if autoload?(const_name).nil? or force_autoload
          const = const_get(const_name)
          if const.is_a?(Module)
            if const.is_a?(Class)
              result << const if const.ancestors.include?(base_class)
            elsif recursive
              result += const.sub_classes(base_class, force_autoload, recursive)
            end
          end
        end
      end
      result
    end

Return the inheritance tree of the base_class. Example:

module M

  class A; end
  class B < A; end
  class C < B; end
  class D < B; end
  class E < A; end
  module N
    class F < A; end
    class G < F; end
    class H < D; end
    class I < H; end
    class J < E; end
    class Y; end
  end
  class Z; end
  FOO = 42

end

M.sub_classes_tree(M::A)

produces:

{

  M::A => {
    M::B => {
      M::D => {},
      M::C => {}
    },
    M::E => {}
  }

}

and

M.sub_classes_tree(M::A, false, true)

produces:

{

  M::A => {
    M::N::F => {
      M::N::G => {}
    },
    M::B => {
      M::C => {},
      M::D => {
        M::N::H => {
          M::N::I => {}
        }
      }
    },
    M::E => {
      M::N::J => {}
    }
  }

}

[Source]

# File lib/module_extensions/hierarchy.rb, line 111
    def sub_classes_tree(base_class, force_autoload=false, recursive=false)
      subs = sub_classes(base_class, force_autoload, recursive)
      sub_classes_tree_rec([base_class], subs)
    end

[Validate]