class Inheritance

Resolves relationships and inherited methods for a definition.

Definitions

Relationship = Struct.new(:kind, :name, :definition)

A relationship declared by a definition.

Method = Struct.new(:name, :definition)

A method inherited from another definition.

Group = Struct.new(:kind, :definition, :methods)

Methods inherited through a direct relationship.

def initialize(index, definition)

Initialize inheritance resolution for the given definition.

Signature

parameter index Decode::Index

The index used to resolve relationships.

parameter definition Decode::Definition

The definition to inspect.

Implementation

def initialize(index, definition)
	@index = index
	@definition = definition
end

attr :definition

The definition being inspected.

Signature

attribute Decode::Definition

def relationships

Enumerate the directly declared relationships.

Signature

returns Array(Relationship)

The relationships in declaration order.

Implementation

def relationships
	@relationships ||= begin
		relationships = []
		
		if @definition.respond_to?(:super_class) && (name = @definition.super_class)
			relationships << relationship(:super_class, name)
		end
		
		{
			prepends: :prepend,
			includes: :include,
			extends: :extend,
		}.each do |attribute, kind|
			if @definition.respond_to?(attribute)
				@definition.public_send(attribute).each do |name|
					relationships << relationship(kind, name)
				end
			end
		end
		
		relationships
	end
end

def inherited_methods

Enumerate documented public and protected methods inherited by the definition.

Signature

returns Array(Group)

Methods grouped by the direct relationship which provides them.

Implementation

def inherited_methods
	@groups = []
	@groups_by_relationship = {}
	
	collect_instance_methods(@definition, false, {}, {})
	collect_class_methods(@definition, false, {}, {})
	
	return @groups
end