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/mixin.rb, line 75
def module
return @module if @module
# search the current context
return @name unless parent
full_name = parent.child_name(@name)
@module = @store.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 = @store.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 = @store.modules_hash[full_name]
return @module if @module
up = up.parent
end
@name
end