A Module include in a class with #include
Name of included module
Creates a new Include for name
with
comment
# File lib/rdoc/include.rb, line 14 def initialize(name, comment) super() @name = name self.comment = comment @module = nil # cache for module if found end
Includes are sorted by name
# File lib/rdoc/include.rb, line 24 def <=> other return unless self.class === other name <=> other.name end
Full name based on #module
# File lib/rdoc/include.rb, line 39 def full_name m = self.module RDoc::ClassModule === m ? m.full_name : @name end
Attempts to locate the included module object. Returns the name if not known.
The scoping rules of Ruby to resolve the name of an included module are:
first look into the children of the current context;
if not found, look into the children of included modules, in reverse inclusion order;
if still not found, go up the hierarchy of names.
This method has O(n!)
behavior when the module calling include
is referencing nonexistent modules. Avoid calling #module until after all the files
are parsed. This behavior is due to ruby’s constant lookup behavior.
As of the beginning of October, 2011, no gem includes nonexistent modules.
# File lib/rdoc/include.rb, line 73 def module return @module if @module # search the current context return @name unless parent full_name = parent.child_name(@name) @module = RDoc::TopLevel.modules_hash[full_name] return @module if @module return @name if @name =~ /^::/ # search the includes before this one, in reverse order searched = parent.includes.take_while { |i| i != self }.reverse searched.each do |i| inc = i.module next if String === inc full_name = inc.child_name(@name) @module = RDoc::TopLevel.modules_hash[full_name] return @module if @module end # go up the hierarchy of names up = parent.parent while up full_name = up.child_name(@name) @module = RDoc::TopLevel.modules_hash[full_name] return @module if @module up = up.parent end @name end