Module: Hierarchy
- Included in:
- Module
- Defined in:
- lib/module/hierarchy.rb,
lib/module/hierarchy.rb
Overview
class Module
Instance Method Summary collapse
-
#remove_class(base_class, recursive = false) ⇒ Object
Remove a class from the hierarchy using remove_const.
-
#sub_classes(base_class, force_autoload = false, recursive = false) ⇒ Object
Return the list of all sub classes of base_class (including itself).
-
#sub_classes_tree(base_class, force_autoload = false, recursive = false) ⇒ Object
Return the inheritance tree of the base_class.
Instance Method Details
#remove_class(base_class, recursive = false) ⇒ Object
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.
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/module/hierarchy.rb', line 37 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 |
#sub_classes(base_class, force_autoload = false, recursive = false) ⇒ Object
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.
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/module/hierarchy.rb', line 16 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 |
#sub_classes_tree(base_class, force_autoload = false, recursive = false) ⇒ Object
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 => {}
}
}
}
112 113 114 115 |
# File 'lib/module/hierarchy.rb', line 112 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 |