Completed
Push — dev ( 73864e...ffd8f7 )
by Fike
38s
created

Registry.initialize()   A

Complexity

Conditions 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 3
rs 10
cc 1
1
# frozen_String_literal: true
2
3
require 'logger'
4
5
module AMA
6
  module Entity
7
    class Mapper
8
      class Type
9
        # Holds all registered types
10
        class Registry
11
          attr_accessor :types
12
13
          def initialize
14
            @types = {}
15
          end
16
17
          # @param [AMA::Entity::Mapper::Type::Concrete] type
18
          def register(type)
19
            @types[type.type] = type
20
          end
21
22
          # @param [Class] klass
23
          def registered?(klass)
24
            @types.key?(klass)
25
          end
26
27
          def for(klass)
28
            find_class_types(klass) | find_module_types(klass)
29
          end
30
31
          private
32
33
          def inheritance_chain(klass)
34
            cursor = klass
35
            chain = []
36
            loop do
37
              chain.push(cursor)
38
              cursor = cursor.superclass
39
              break if cursor.nil?
40
            end
41
            chain
42
          end
43
44
          def find_class_types(klass)
45
            inheritance_chain(klass).each_with_object([]) do |entry, carrier|
46
              carrier.push(types[entry]) if types[entry]
47
            end
48
          end
49
50
          def find_module_types(klass)
51
            chain = inheritance_chain(klass).reverse
52
            result = chain.reduce([]) do |carrier, entry|
53
              ancestor_types = entry.ancestors.map do |candidate|
54
                types[candidate]
55
              end
56
              carrier | ancestor_types.reject(&:nil?)
57
            end
58
            result.reverse
59
          end
60
        end
61
      end
62
    end
63
  end
64
end
65