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