Sha256: 35880aa8a47e741e96509fad53b1edfd5e13708a7a45c3718545d736dbe28dcb

Contents?: true

Size: 1.35 KB

Versions: 4

Compression:

Stored size: 1.35 KB

Contents

# Global registry for storing common configuration.

module Adva
  class Registry < Hash
    class << self
      def instance
        @@instance ||= new
      end
    
      def get(*args)
        instance.get(*args)
      end
    
      def set(*args)
        instance.set(*args)
      end
    
      def clear
        instance.clear
      end
    end

    def initialize
      super &lambda { |hash, key| hash[key] = Registry.new }
    end

    def set(*args)
      value, last_key = args.pop, args.pop.to_sym
      target = args.inject(self) { |result, key| result[key.to_sym] }

      case value
      when Hash
        target[last_key].merge!(to_registry(value))
      when Array
        target[last_key] = Array(target[last_key]) unless target[last_key].is_a?(Array)
        target[last_key] += value
      else
        target.merge!(last_key => value)
      end
    end

    def get(*keys)
      keys.map { |key| key.to_sym }.inject(self) do |result, key| 
        return nil unless result.has_key?(key)
        result[key]
      end
    end
  
    protected
    
      def merge!(other)
        other.each { |key, value| self[key] = value }
      end
  
      def to_registry(hash)
        hash.inject(Registry.new) do |registry, (key, value)|
          registry[key.to_sym] = value.is_a?(Hash) ? to_registry(value) : value
          registry
        end
      end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
adva-core-0.0.5 lib/adva/registry.rb
adva-core-0.0.4 lib/adva/registry.rb
adva-core-0.0.2 lib/adva/registry.rb
adva-core-0.0.1 lib/adva/registry.rb