class Yoda::Store::Query::Associators::AssociateAncestors::Processor

Attributes

registry[R]

@return [Registry]

Public Class Methods

new(registry) click to toggle source

@param registry [Registry]

# File lib/yoda/store/query/associators/associate_ancestors.rb, line 42
def initialize(registry)
  @registry = registry
end

Public Instance Methods

find_metaclass_superclass_ancestors(obj) click to toggle source

@param obj [Objects::MetaClassObject] @return [Enumerator<Objects::NamespaceObject>]

# File lib/yoda/store/query/associators/associate_ancestors.rb, line 96
def find_metaclass_superclass_ancestors(obj)
  base_class = registry.find(obj.base_class_address)
  if base_class && base_class.is_a?(Objects::ClassObject) && base_class.superclass_path
    (meta_class = FindMetaClass.new(registry).find(base_class.superclass_path || 'Object')) ? process(meta_class) : []
  elsif base_class
    (class_object = registry.find('Class')) ? process(class_object) : []
  else
    []
  end
end
find_mixins(obj) click to toggle source

@param obj [Objects::NamespaceObject] @return [Enumerator<Objects::NamespaceObject>]

# File lib/yoda/store/query/associators/associate_ancestors.rb, line 74
def find_mixins(obj)
  Enumerator.new do |yielder|
    obj.mixin_addresses.each do |address|
      if el = registry.find(address.to_s)
        yielder << el
      end
    end
  end
end
find_superclass_ancestors(obj) click to toggle source

@param obj [Objects::ClassObject] @return [Enumerator<Objects::NamespaceObject>]

# File lib/yoda/store/query/associators/associate_ancestors.rb, line 86
def find_superclass_ancestors(obj)
  if obj.superclass_path && super_class = FindConstant.new(registry).find(obj.superclass_path)
    process(super_class)
  else
    []
  end
end
met() click to toggle source

@return [Set<Objects::Base>]

# File lib/yoda/store/query/associators/associate_ancestors.rb, line 48
def met
  @met ||= Set.new
end
process(scope) click to toggle source

@param scope [Objects::NamespaceObject] @return [Enumerator<Objects::NamespaceObject>]

# File lib/yoda/store/query/associators/associate_ancestors.rb, line 54
def process(scope)
  fail CircularReferenceError, scope if met.include?(scope)
  met.add(scope)

  Enumerator.new do |yielder|
    if scope.is_a?(Objects::NamespaceObject)
      yielder << scope
      find_mixins(scope).each { |mixin| yielder << mixin }

      if scope.is_a?(Objects::MetaClassObject)
        find_metaclass_superclass_ancestors(scope).each { |obj| yielder << obj }
      elsif scope.is_a?(Objects::ClassObject)
        find_superclass_ancestors(scope).each { |obj| yielder << obj }
      end
    end
  end
end