| 
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 | # File 'lib/cskit/registry.rb', line 17
def create(family, plural_family)
  Module.new do
    define_method :"register_#{family}" do |config|
      register(family, config[:id], config[family].new(config))
    end
    define_method :"get_#{family}" do |id|
      get(family, id)
    end
    define_method :"#{plural_family}" do
      all(family)
    end
    define_method :"#{family}_available?" do |id|
      available?(family, id)
    end
    private
    def register(family, key, obj)
      (registry[family.to_sym] ||= {})[key.to_sym] = obj
    end
    def get(family, key)
      registry[family.to_sym][key.to_sym] || get_for_family(family, key)
    end
    def all(family)
      registry.fetch(family, [])
    end
    def get_for_family(family, type)
      found = registry[family.to_sym].find do |key, obj|
        obj.config[:type] == type
      end
      found.last if found
    end
    def available?(family, key)
      !!registry[family.to_sym][key.to_sym] rescue false
    end
  end
end
 |