Sha256: 41de7a8fc017348e1474a0c4880512828d194ea31a2554dbcc627d22acb6d457

Contents?: true

Size: 1.06 KB

Versions: 1

Compression:

Stored size: 1.06 KB

Contents

require 'active_support/core_ext/hash/indifferent_access'

module Pears 
  # A subject is a collection of settings.
  # You could different Pears::Subjects in your application for different parts
  # of its domain. for instance: application_settings, theming or translaions.
  class Subject
    include Enumerable
    attr_reader :name

    def initialize(name, *layers)
      @name = name
      @layers = layers
    end

    def [](key)
      project[key]
    end

    def keys
      project.keys
    end

    def has_key?(key)
      project.has_key? key
    end

    def dig(*args)
      project.dig(*args)
    end

    def purge
      @layers.each.each(&:purge)
    end

    def push_layer(layer)
      @layers << layer
    end

    # Projects the layers to a hash that van be used as a single source of truth.
    def project
      layers.reverse.reduce(Hash.new) do |hash, layer|
        hash.deep_merge(layer.data)
      end.with_indifferent_access
    end

    def each(&block)
      project.each(&block)
    end

    private

    def layers
      @layers
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
pears-0.3.0 lib/pears/subject.rb