class SmartCore::Container

@api public @since 0.1.0

Constants

ArgumentError

@api public @since 0.1.0

DependencyOverNamespaceOverlapError

@see SmartCore::Container::DependencyCompatability::General @see SmartCore::Container::DependencyCompatability::Definition @see SmartCore::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 @see SmartCore::Container::DependencyCompatability::Definition @see SmartCore::Container::DependencyCompatability::Registry

@api public @since 0.1.0

VERSION

@api public @since 0.1.0 @version 0.9.0

Attributes

host[R]

@return [SmartCore::Container::Host]

@api private @since 0.8.1

registry[R]

@return [SmartCore::Container::Registry]

@api private @since 0.1.0

watcher[R]

@return [SmartCore::Container::DependencyWatcher]

@api private @since 0.8.0

Public Class Methods

define(initial_container_klass = self, &container_definitions) click to toggle source

@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
new(host_container: NO_HOST_CONTAINER, host_path: NO_HOST_PATH) click to toggle source

@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

[](dependency_path)
Alias for: resolve
clear_listeners(entity_path = nil)
Alias for: clear_observers
clear_observers(entity_path = nil) click to toggle source

@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
Also aliased as: clear_listeners
dependency?(dependency_path, memoized: nil) click to toggle source

@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
each( yield_all: SmartCore::Container::Registry::DEFAULT_ITERATION_YIELD_BEHAVIOUR, &block )
Alias for: each_dependency
each_dependency( yield_all: SmartCore::Container::Registry::DEFAULT_ITERATION_YIELD_BEHAVIOUR, &block ) click to toggle source

@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
Also aliased as: each, each_pair
each_pair( yield_all: SmartCore::Container::Registry::DEFAULT_ITERATION_YIELD_BEHAVIOUR, &block )
Alias for: each_dependency
fetch(dependency_path) click to toggle source

@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
freeze!() click to toggle source

@return [void]

@api public @since 0.1.0

# File lib/smart_core/container.rb, line 150
def freeze!
  thread_safe { registry.freeze! }
end
frozen?() click to toggle source

@return [Boolean]

@api public @since 0.1.0

# File lib/smart_core/container.rb, line 158
def frozen?
  thread_safe { registry.frozen? }
end
hash_tree(resolve_dependencies: false) click to toggle source

@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
Also aliased as: to_h, to_hash
key?(key) click to toggle source

@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
keys(all_variants: SmartCore::Container::Registry::DEFAULT_KEY_EXTRACTION_BEHAVIOUR) click to toggle source

@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
namespace(namespace_name, &dependencies_definition) click to toggle source

@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
namespace?(namespace_path) click to toggle source

@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
observe(entity_path, &observer) click to toggle source

@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
Also aliased as: subscribe
register( dependency_name, memoize: SmartCore::Container::Registry::DEFAULT_MEMOIZATION_BEHAVIOR, &dependency_definition ) click to toggle source

@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
reload!() click to toggle source

@return [void]

@api public @since 0.1.0

# File lib/smart_core/container.rb, line 166
def reload!
  thread_safe { build_registry! }
end
resolve(dependency_path) click to toggle source

@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
Also aliased as: []
subscribe(entity_path, &observer)
Alias for: observe
to_h(resolve_dependencies: false)
Alias for: hash_tree
to_hash(resolve_dependencies: false)
Alias for: hash_tree
unobserve(observer) click to toggle source

@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
Also aliased as: unsubscribe
unsubscribe(observer)
Alias for: unobserve

Private Instance Methods

build_registry!() click to toggle source

@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
thread_safe(&block) click to toggle source

@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