1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 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 62 63 64 65 66 67 68
|
require 'thread'
module Flipper
# Internal: Used to store registry of groups by name.
class Registry
include Enumerable
class Error < StandardError; end
class DuplicateKey < Error; end
class KeyNotFound < Error
# Public: The key that was not found
attr_reader :key
def initialize(key)
@key = key
super("Key #{key.inspect} not found")
end
end
def initialize(source = {})
@mutex = Mutex.new
@source = source
end
def keys
@mutex.synchronize { @source.keys }
end
def values
@mutex.synchronize { @source.values }
end
def add(key, value)
key = key.to_sym
@mutex.synchronize do
if @source[key]
raise DuplicateKey, "#{key} is already registered"
else
@source[key] = value
end
end
end
def get(key)
key = key.to_sym
@mutex.synchronize do
@source[key]
end
end
def key?(key)
key = key.to_sym
@mutex.synchronize do
@source.key?(key)
end
end
def each(&block)
@mutex.synchronize { @source.dup }.each(&block)
end
def clear
@mutex.synchronize { @source.clear }
end
end
end
|