class SmartCore::Injection::Locator::ContainerProxy
@api private @since 0.1.0
Attributes
@return [NilClass, SmartCore::Container]
@api private @since 0.1.0
@return [Hash<String,Proc>]
@api private @since 0.1.0
@return [SmartCore::Injection::Injector::ContainerSet]
@api private @since 0.1.0
Public Class Methods
@param registered_containers
[SmartCore::Injection::Injector::ContainerSet] @param explicitly_passed_container
[NilClass, SmartCore::Container] @return [void]
@api private @since 0.1.0
# File lib/smart_core/injection/locator/container_proxy.rb, line 12 def initialize(registered_containers, explicitly_passed_container) @registered_containers = registered_containers @explicitly_passed_container = explicitly_passed_container @observers = Hash.new { |h, k| h[k] = [] } registered_containers.listen_addings { |container| listen_changes(container) } end
Public Instance Methods
@param import_path [String] @param observer [Block] @return [void]
@api private @since 0.1.0
# File lib/smart_core/injection/locator/container_proxy.rb, line 53 def observe(import_path, &observer) register_observer(import_path, observer) each_container do |container| container.observe(import_path) { |path, cntr| process_changement(cntr, path) } end end
@param dependency_path [String] @return [Any]
@raise [SmartCore::Injection::NoRegisteredContainersError] @raise [SmartCore::Container::ResolvingError]
@api private @since 0.1.0
# File lib/smart_core/injection/locator/container_proxy.rb, line 27 def resolve_dependency(dependency_path) resolving_error = nil each_container do |container| begin # rubocop:disable Style/RedundantBegin return container.resolve(dependency_path) rescue SmartCore::Container::ResolvingError => error resolving_error = error end end unless resolving_error raise(SmartCore::Injection::NoRegisteredContainersError, <<~ERROR_MESSAGE) You haven't registered any containers for import. ERROR_MESSAGE else raise(resolving_error) end end
Private Instance Methods
@param block [Block] @yield [container] @yieldparam container [SmartCore::Container] @return [Enumerable]
@api private @since 0.1.0
# File lib/smart_core/injection/locator/container_proxy.rb, line 131 def each_container(&block) enumerator = Enumerator.new do |yielder| if explicitly_passed_container yielder.yield(explicitly_passed_container) else registered_containers.reverse_each(&yielder) end end block_given? ? enumerator.each(&block) : enumerator.each end
@param import_pathes [String] @return [void]
@api private @since 0.1.0
# File lib/smart_core/injection/locator/container_proxy.rb, line 120 def notify_observers(*import_pathes) import_pathes.each { |import_path| observers.fetch(import_path).each(&:call) } end
@return [Array<String>]
@api private @since 0.1.0
# File lib/smart_core/injection/locator/container_proxy.rb, line 111 def observed_import_pathes observers.keys end
@param import_path [NilClass, String] @param container [SmartCore::Container] @return [void]
@api private @since 0.1.0
# File lib/smart_core/injection/locator/container_proxy.rb, line 87 def process_changement(container, import_path = nil) observed_pathes = import_path ? [import_path] : observed_import_pathes observed_pathes.each do |observed_path| suitable_container = each_container.find { |cntr| cntr.key?(observed_path) } break unless suitable_container notify_observers(observed_path) if suitable_container == container end end
@param import_path [String] @param observer [SmartCore::Container] @return [void]
@api private @since 0.1.0
# File lib/smart_core/injection/locator/container_proxy.rb, line 103 def register_observer(import_path, observer) observers[import_path] << observer end