<%= @klass.class == Module ? "module" : "class" %> <%= @klass.name %> <% if @superclass %> < <%= @superclass.name %> <% end %> <% if @class_ancestors %> < <%= @class_ancestors. map { |ancestor| link_to(ancestor.name, constant_path(ancestor.name)) }. join(" < ") %> <% end %>

<% unless @methods.files.empty? %>

Defined In Files

<% files = @methods.files.sort %> <% shown, hidden = files[0..5], files[6..-1] %> <% shown.each do |path| %> <%= link_to_file(path) %>
<% end %> <% if hidden && !hidden.empty? %>
... <%= hidden.size %> files more
<% hidden.each do |path| %> <%= link_to_file(path) %>
<% end %>
<% end %>
<% end %> <% unless @methods.constants.empty? %>

Nested Classes/Modules

<%= content_tag(:pre, constants_table(@klass, @methods.constants)) %>
<% end %> <% unless @methods.descendants.empty? %>

<%= @klass.instance_of?(Module) ? "Included In" : "Descendants" %>

<%= content_tag(:pre, constants_table(@klass, @methods.descendants)) %>
<% end %>

Ancestor Chain

Singleton classes are included. The chain is flattened, Classes/Modules which don't contribute any methods are not shown.
Legend:
[M]
- included Module;
[C]
- inherited Class;
S[M]
- Module included in singleton class;
<% @methods.all.each do |ancestor_with_level_methods| %> <% ancestor, level_methods = ancestor_with_level_methods.keys[0], ancestor_with_level_methods.values[0] %>

<% ancestor_type, ancestor_constant = ancestor.split %> <%= link_to(ancestor, constant_path(ancestor_constant)) %>

<% if methods = level_methods[:class] %>
<% methods.each do |visibility, methods| %>
Class <%= visibility.to_s.capitalize %>
<% method_method = ancestor_type == "S[M]" ? :instance : :class %> <%= content_tag(:pre, new_methods_table(ancestor_constant, method_method, methods)) %> <% end %>
<% end %> <% if methods = level_methods[:instance] %>
<% methods.each do |visibility, methods| %>
Instance <%= visibility.to_s.capitalize %>
<%= content_tag(:pre, new_methods_table(ancestor_constant, :instance, methods)) %> <% end %>
<% end %> <% end %>