-
# frozen_string_literal: true
-
-
1
require "concurrent/hash"
-
-
1
module Containable
-
# Provides safe registration and resolution of dependencies.
-
1
class Builder < Module
-
1
def initialize dependencies = Concurrent::Hash.new, register: Register, resolver: Resolver
-
201
super()
-
-
201
@dependencies = dependencies
-
201
@register = register.new dependencies
-
201
@resolver = resolver.new dependencies
-
-
3015
private_methods.grep(/\A(define)_/).sort.each { |method| __send__ method }
-
-
201
alias_method :[]=, :register
-
201
alias_method :[], :resolve
-
-
201
freeze
-
end
-
-
1
def extended descendant
-
200
then: 3
else: 197
fail TypeError, "Only a module can be a container." if descendant.is_a? Class
-
-
197
super
-
1
descendant.class_eval "private_class_method :dependencies", __FILE__, __LINE__
-
end
-
-
1
private
-
-
1
attr_reader :dependencies, :register, :resolver
-
-
1
def define_dependencies target = dependencies
-
519
define_method(:dependencies) { target }
-
end
-
-
1
def define_register target = register
-
201
define_method :register do |key, value = nil, as: :cache, &block|
-
190
then: 9
else: 181
fail FrozenError, "Can't modify frozen container." if dependencies.frozen?
-
-
181
target.call key, value, as:, &block
-
end
-
end
-
-
1
def define_namespace target = register
-
213
define_method(:namespace) { |name, &block| target.namespace name, &block }
-
end
-
-
1
def define_resolve target = resolver
-
270
define_method(:resolve) { |key| target.call key }
-
end
-
-
1
def define_each target = dependencies
-
226
define_method(:each) { |&block| target.transform_values(&:first).each(&block) }
-
end
-
-
1
def define_each_key target = dependencies
-
207
define_method(:each_key) { |&block| target.each_key(&block) }
-
end
-
-
1
def define_key? target = dependencies
-
275
define_method(:key?) { |name| target.key? name }
-
end
-
-
1
def define_keys target = dependencies
-
207
define_method(:keys) { target.keys }
-
end
-
-
1
def define_clone
-
201
define_method :clone do
-
24
then: 3
else: 9
dup.tap { |duplicate| duplicate.freeze if dependencies.frozen? }
-
end
-
end
-
-
1
def define_dup target = self.class,
-
local_register: register.class,
-
local_resolver: resolver.class
-
201
define_method :dup do
-
18
instance = target.new dependencies.dup, register: local_register, resolver: local_resolver
-
18
Module.new.set_temporary_name("containable").extend instance
-
end
-
end
-
-
1
def define_freeze
-
225
define_method(:freeze) { dependencies.freeze and self }
-
end
-
-
1
def define_frozen?
-
216
define_method(:frozen?) { dependencies.frozen? }
-
end
-
-
1
def define_stub
-
201
define_method :stub! do |**keywords|
-
36
require "containable/test"
-
-
36
extend Test
-
-
36
stub(**keywords)
-
end
-
end
-
-
4
def define_restore = define_method(:restore) { false }
-
end
-
end