Register components in a single location that can be queried.
This allows certain components (such as guest systems, configuration pieces, etc.) to be registered and queried, lazily.
# File lib/vagrant/registry.rb, line 7 def initialize @items = {} @results_cache = {} end
# File lib/vagrant/registry.rb, line 78 def __internal_state { :items => @items, :results_cache => @results_cache } end
Iterate over the keyspace.
# File lib/vagrant/registry.rb, line 46 def each(&block) @items.each do |key, _| yield key, get(key) end end
Get a value by the given key.
This will evaluate the block given to `register` and return the resulting value.
# File lib/vagrant/registry.rb, line 24 def get(key) return nil if !@items.has_key?(key) return @results_cache[key] if @results_cache.has_key?(key) @results_cache[key] = @items[key].call end
Checks if the given key is registered with the registry.
@return [Boolean]
# File lib/vagrant/registry.rb, line 34 def has_key?(key) @items.has_key?(key) end
Returns an array populated with the keys of this object.
@return [Array]
# File lib/vagrant/registry.rb, line 41 def keys @items.keys end
Merge one registry with another and return a completely new registry. Note that the result cache is completely busted, so any gets on the new registry will result in a cache miss.
# File lib/vagrant/registry.rb, line 55 def merge(other) self.class.new.tap do |result| result.merge!(self) result.merge!(other) end end
Like #{merge} but merges into self.
# File lib/vagrant/registry.rb, line 63 def merge!(other) @items.merge!(other.__internal_state[:items]) self end
Register a key with a lazy-loaded value.
If a key with the given name already exists, it is overwritten.
# File lib/vagrant/registry.rb, line 15 def register(key, &block) raise ArgumentError, "block required" if !block_given? @items[key] = block end
Converts this registry to a hash
# File lib/vagrant/registry.rb, line 69 def to_hash result = {} self.each do |key, value| result[key] = value end result end