Sha256: 93ed47d227c0e1b7c6c17cad04f709d611fb6852861c6a931a3159f0c5065b30

Contents?: true

Size: 1.33 KB

Versions: 6

Compression:

Stored size: 1.33 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

6 entries across 6 versions & 1 rubygems

Version Path
adva-core-0.0.14 lib/adva/registry.rb
adva-core-0.0.13 lib/adva/registry.rb
adva-core-0.0.9 lib/adva/registry.rb
adva-core-0.0.8 lib/adva/registry.rb
adva-core-0.0.7 lib/adva/registry.rb
adva-core-0.0.6 lib/adva/registry.rb