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

Registry   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 51
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 7
c 0
b 0
f 0
dl 0
loc 51
rs 10

7 Methods

Rating   Name   Duplication   Size   Complexity  
A find_class_types() 0 5 1
A registered? 0 3 1
A register() 0 3 1
A for() 0 3 1
A inheritance_chain() 0 10 1
A initialize() 0 3 1
A find_module_types() 0 10 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