Sha256: 990b5ec36b2a77ec0f44ee28b9515d7843e8a2222f32cfdb81b9e161b335153d

Contents?: true

Size: 1.22 KB

Versions: 2

Compression:

Stored size: 1.22 KB

Contents

module Manioc
  class Container
    class DSL < BasicObject
      def initialize &block
        @fields = {}
        instance_exec(&block)
      end

      def to_h
        @fields
      end

      def method_missing name, *args, &block
        return super if args.any?
        @fields[name] = block
      end
    end

    def initialize constructors: {}, &block
      @constructors, @cache = constructors, {}

      register(&block) if block
      finalize
    end

    def with &block
      self.class.new constructors: @constructors.dup, &block
    end

    def clone
      with
    end

    def reset! *keys
      keys = @cache.keys if keys.empty?
      keys.each { |k| @cache.delete k }
    end

    def preload!
      @constructors.keys.each { |key| resolve key }
    end

    def inspect
      # :nocov:
      %|<#{self.class.name}(#{@constructors.keys.join(', ')})>|
      # :nocov:
    end

    private

    def register &block
      @constructors.merge! DSL.new(&block).to_h
    end

    def resolve key
      @cache[key] ||= instance_exec(&@constructors[key])
    end

    def finalize
      @constructors.freeze
      @constructors.keys.each do |key|
        define_singleton_method(key) { resolve key }
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
manioc-0.1.5 lib/manioc/container.rb
manioc-0.1.4 lib/manioc/container.rb