| Module | ModuleExtensions::Hierarchy |
| In: |
lib/module_extensions/hierarchy.rb
|
Extend the Module class with methods to manipulate inheritance relation between constants of a module.
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.
# 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.
# 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 => {}
}
}
}
# 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