class SmartCore::Container
@api public @since 0.1.0
Constants
- ArgumentError
@api public @since 0.1.0
- DependencyOverNamespaceOverlapError
@see
SmartCore::Container::DependencyCompatability::General
@seeSmartCore::Container::DependencyCompatability::Definition
@seeSmartCore::Container::DependencyCompatability::Registry
@api public @since 0.1.0
- Error
@api public @since 0.1.0
- FetchError
@api public @since 0.1.0
- FrozenRegistryError
@see
SmartCore::Container::Registry
@api public @since 0.1.0
- IncompatibleEntityNameError
@api public @since 0.1.0
- NO_HOST_CONTAINER
@return [NilClass]
@api private @since 0.8.1
- NO_HOST_PATH
@return [NilClass]
@api private @since 0.8.1
- NamespaceOverDependencyOverlapError
@see
SmartCore::Container::DependencyCompatability::General
@seeSmartCore::Container::DependencyCompatability::Definition
@seeSmartCore::Container::DependencyCompatability::Registry
@api public @since 0.1.0
- VERSION
@api public @since 0.1.0 @version 0.9.0
Attributes
@return [SmartCore::Container::Host]
@api private @since 0.8.1
@return [SmartCore::Container::Registry]
@api private @since 0.1.0
@return [SmartCore::Container::DependencyWatcher]
@api private @since 0.8.0
Public Class Methods
@param initial_container_klass [Class<SmartCore::Container>] @param container_definitions [Block] @return [SmartCore::Container]
@api public @since 0.7.0
# File lib/smart_core/container.rb, line 32 def define(initial_container_klass = self, &container_definitions) unless initial_container_klass <= SmartCore::Container raise(SmartCore::Container::ArgumentError, <<~ERROR_MESSAGE) Base class should be a type of SmartCore::Container ERROR_MESSAGE end Class.new(initial_container_klass, &container_definitions).new end
@option host_container [SmartCore::Container, NilClass] @option host_path [String, NilClass] @return [void]
@api public @since 0.1.0 @version 0.8.1
# File lib/smart_core/container.rb, line 86 def initialize(host_container: NO_HOST_CONTAINER, host_path: NO_HOST_PATH) @host = SmartCore::Container::Host.build(host_container, host_path) build_registry! @watcher = SmartCore::Container::DependencyWatcher.new(self) @host_path = host_path @access_lock = ArbitraryLock.new end
Public Instance Methods
@param entity_path [String, Symbol, NilClass] @return [void]
@api public @since 0.8.0
# File lib/smart_core/container.rb, line 265 def clear_observers(entity_path = nil) # TODO: support for pattern-based pathes thread_safe { watcher.clear_listeners(entity_path) } end
@param dependency_path [String, Symbol] @option memoized [NilClass, Boolean] @return [Boolean]
@api public @since 0.5.0
# File lib/smart_core/container.rb, line 203 def dependency?(dependency_path, memoized: nil) thread_safe { DependencyResolver.dependency?(self, dependency_path, memoized: memoized) } end
@option yield_all [Boolean] @param block [Block] @yield [dependency_name, dependency_value] @yield_param dependency_name [String] @yield_param dependency_value [Any, SmartCore::Container] @return [Enumerable]
@api public @since 0.4.0
# File lib/smart_core/container.rb, line 216 def each_dependency( yield_all: SmartCore::Container::Registry::DEFAULT_ITERATION_YIELD_BEHAVIOUR, &block ) thread_safe { registry.each_dependency(yield_all: yield_all, &block) } end
@param dependency_path [String, Symbol] @return [Any]
@api public @since 0.1.0
# File lib/smart_core/container.rb, line 142 def fetch(dependency_path) thread_safe { DependencyResolver.fetch(self, dependency_path) } end
@return [void]
@api public @since 0.1.0
# File lib/smart_core/container.rb, line 150 def freeze! thread_safe { registry.freeze! } end
@return [Boolean]
@api public @since 0.1.0
# File lib/smart_core/container.rb, line 158 def frozen? thread_safe { registry.frozen? } end
@option resolve_dependencies [Boolean] @return [Hash<String|Symbol,SmartCore::Container::Entities::Base|Any>]
@api public @since 0.1.0
# File lib/smart_core/container.rb, line 230 def hash_tree(resolve_dependencies: false) thread_safe { registry.hash_tree(resolve_dependencies: resolve_dependencies) } end
@param key [String, Symbol] @return [Boolean]
@api public @since 0.5.0
# File lib/smart_core/container.rb, line 184 def key?(key) thread_safe { DependencyResolver.key?(self, key) } end
@option all_variants [Boolean] @return [Array<String>]
@api public @since 0.4.0
# File lib/smart_core/container.rb, line 175 def keys(all_variants: SmartCore::Container::Registry::DEFAULT_KEY_EXTRACTION_BEHAVIOUR) thread_safe { registry.keys(all_variants: all_variants) } end
@param namespace_name [String, Symbol] @param dependencies_definition [Block] @return [void]
@api public @since 0.1.0 @version 0.8.0
# File lib/smart_core/container.rb, line 119 def namespace(namespace_name, &dependencies_definition) thread_safe do registry.register_namespace(namespace_name, self, &dependencies_definition) watcher.notify(namespace_name) end end
@param namespace_path [String, Symbol] @return [Boolean]
@api public @since 0.5.0
# File lib/smart_core/container.rb, line 193 def namespace?(namespace_path) thread_safe { DependencyResolver.namespace?(self, namespace_path) } end
@param entity_path [String] @param observer [Block] @yield [entity_path, container] @yieldparam entity_path [String] @yieldparam container [SmartCore::Container] @return [SmartCore::Container::DependencyWatcher::Observer]
@api public @since 0.8.0
# File lib/smart_core/container.rb, line 245 def observe(entity_path, &observer) # TODO: support for pattern-based pathes thread_safe { watcher.watch(entity_path, &observer) } end
@param dependency_name [String, Symbol] @param dependency_definition [Block] @return [void]
@api public @sicne 0.1.0 @version 0.8.0
# File lib/smart_core/container.rb, line 101 def register( dependency_name, memoize: SmartCore::Container::Registry::DEFAULT_MEMOIZATION_BEHAVIOR, &dependency_definition ) thread_safe do registry.register_dependency(dependency_name, memoize: memoize, &dependency_definition) watcher.notify(dependency_name) end end
@return [void]
@api public @since 0.1.0
# File lib/smart_core/container.rb, line 166 def reload! thread_safe { build_registry! } end
@param dependency_path [String, Symbol] @return [Any]
@api public @since 0.1.0 @version 0.1.0
# File lib/smart_core/container.rb, line 132 def resolve(dependency_path) thread_safe { DependencyResolver.resolve(self, dependency_path) } end
@param observer [SmartCore::Container::DependencyWatcher::Observer] @return [Boolean]
@api public @since 0.8.0
# File lib/smart_core/container.rb, line 255 def unobserve(observer) thread_safe { watcher.unwatch(observer) } end
Private Instance Methods
@return [void]
@api private @since 0.1.0 @version 0.8.1
# File lib/smart_core/container.rb, line 277 def build_registry! @registry = RegistryBuilder.build(self) end
@param block [Block] @return [Any]
@api private @since 0.1.0
# File lib/smart_core/container.rb, line 286 def thread_safe(&block) @access_lock.thread_safe(&block) end