class SmartCore::Container::Registry

@api private @since 0.7.0 rubocop:disable Metrics/ClassLength

Attributes

lock[R]

@return [Mutex]

@api private @since 0.7.0

registry[R]

@return [Hash<Symbol,SmartCore::Container::Entity>]

@api private @since 0.7.0

Public Class Methods

new() click to toggle source

@return [void]

@api private @since 0.7.0

# File lib/smart_core/container/registry.rb, line 20
def initialize
  @registry = {}
  @access_lock = SmartCore::Container::ArbitaryLock.new
end

Public Instance Methods

each(&block) click to toggle source

@param block [Block] @return [Enumerable]

@api private @since 0.7.0

# File lib/smart_core/container/registry.rb, line 75
def each(&block)
  thread_safe { enumerate(&block) }
end
freeze!() click to toggle source

@return [void]

@api private @since 0.7.0

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

@return [Boolean]

@api private @since 0.7.0

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

@return [Hash<String|Symbol,SmartCore::Container::Entities::Base|Any>]

@api private @since 0.7.0

# File lib/smart_core/container/registry.rb, line 83
def hash_tree(resolve_dependencies: false)
  thread_safe { build_hash_tree(resolve_dependencies: resolve_dependencies) }
end
Also aliased as: to_h, to_hash
register_dependency(name, &dependency_definition) click to toggle source

@param name [String, Symbol] @param dependency_definition [Block] @return [void]

@api private @since 0.7.0

# File lib/smart_core/container/registry.rb, line 40
def register_dependency(name, &dependency_definition)
  thread_safe { add_dependency(name, dependency_definition) }
end
register_namespace(name, &dependencies_definition) click to toggle source

@param name [String, Symbol] @param dependencies_definition [Block] @return [void]

@api private @since 0.7.0

# File lib/smart_core/container/registry.rb, line 50
def register_namespace(name, &dependencies_definition)
  thread_safe { add_namespace(name, dependencies_definition) }
end
resolve(entity_path) click to toggle source

@param entity_path [String, Symbol] @return [SmartCore::Container::Entity]

@api private @since 0.7.0

# File lib/smart_core/container/registry.rb, line 30
def resolve(entity_path)
  thread_safe { fetch_entity(entity_path) }
end
to_h(resolve_dependencies: false)
Alias for: hash_tree
to_hash(resolve_dependencies: false)
Alias for: hash_tree

Private Instance Methods

add_dependency(dependency_name, dependency_definition) click to toggle source

@param dependency_name [String, Symbol] @param dependency_definition [Proc] @return [SmartCore::Container::Entities::Dependency]

@raise [SmartCore::Container::DependencyOverNamespaceOverlapError]

@api private @since 0.7.0

# File lib/smart_core/container/registry.rb, line 166
def add_dependency(dependency_name, dependency_definition)
  if state_frozen?
    raise(SmartCore::Container::FrozenRegistryError, 'Can not modify frozen registry!')
  end
  dependency_name = indifferently_accessable_name(dependency_name)
  prevent_namespace_overlap!(dependency_name)

  dependency_entity = SmartCore::Container::Entities::DependencyBuilder.build(
    dependency_name, dependency_definition
  )

  dependency_entity.tap { registry[dependency_name] = dependency_entity }
end
add_namespace(namespace_name, dependencies_definition) click to toggle source

@param namespace_name [String, Symbol] @param dependencies_definition [Proc] @return [SmartCore::Container::Entities::Namespace]

@raise [SmartCore::Container::NamespaceOverDependencyOverlapError]

@api private @since 0.7.0

# File lib/smart_core/container/registry.rb, line 188
def add_namespace(namespace_name, dependencies_definition)
  if state_frozen?
    raise(SmartCore::Container::FrozenRegistryError, 'Can not modify frozen registry!')
  end
  namespace_name = indifferently_accessable_name(namespace_name)
  prevent_dependency_overlap!(namespace_name)

  # rubocop:disable Layout/RescueEnsureAlignment
  namespace_entity = begin
    fetch_entity(namespace_name)
  rescue SmartCore::Container::FetchError
    registry[namespace_name] = SmartCore::Container::Entities::NamespaceBuilder.build(
      namespace_name
    )
  end
  # rubocop:enable Layout/RescueEnsureAlignment

  namespace_entity.tap { namespace_entity.append_definitions(dependencies_definition) }
end
build_hash_tree(resolve_dependencies: false) click to toggle source

@return [Hash<String|Symbol,SmartCore::Container::Entities::Base|Any>]

@api private @since 0.7.0

# File lib/smart_core/container/registry.rb, line 109
def build_hash_tree(resolve_dependencies: false)
  {}.tap do |tree|
    enumerate do |(entity_name, entity)|
      case entity
      when SmartCore::Container::Entities::Namespace
        tree[entity_name] = entity.reveal.hash_tree(resolve_dependencies: resolve_dependencies)
      when SmartCore::Container::Entities::Dependency
        tree[entity_name] = resolve_dependencies ? entity.reveal : entity
      end
    end
  end
end
enumerate(&block) click to toggle source

@param block @return [Enumerable]

@api private @since 0.7.0

# File lib/smart_core/container/registry.rb, line 139
def enumerate(&block)
  block_given? ? registry.each(&block) : registry.each
end
fetch_entity(entity_path) click to toggle source

@paramm entity_path [String, Symbol] @return [SmartCore::Container::Entity]

@api private @since 0.7.0 @version 0.8.0

# File lib/smart_core/container/registry.rb, line 149
  def fetch_entity(entity_path)
    dependency_name = indifferently_accessable_name(entity_path)
    registry.fetch(dependency_name)
  rescue KeyError
    raise(SmartCore::Container::ResolvingError.new(<<~MESSAGE, path_part: dependency_name))
      Entity with \"#{dependency_name}\" name does not exist
    MESSAGE
  end
freeze_state() click to toggle source

@return [void]

@api private @since 0.7.0

# File lib/smart_core/container/registry.rb, line 126
def freeze_state
  registry.freeze.tap do
    enumerate do |(entity_name, entity)|
      entity.freeze! if entity.is_a?(SmartCore::Container::Entities::Namespace)
    end
  end
end
indifferently_accessable_name(name) click to toggle source

@param name [String, Symbol] @return [void]

@see [SmartCore::Container::KeyGuard]

@api private @since 0.7.0

# File lib/smart_core/container/registry.rb, line 215
def indifferently_accessable_name(name)
  SmartCore::Container::KeyGuard.indifferently_accessable_key(name)
end
prevent_dependency_overlap!(namespace_name) click to toggle source

@param namespace_name [String] @return [void]

@api private @since 0.7.0

# File lib/smart_core/container/registry.rb, line 235
def prevent_dependency_overlap!(namespace_name)
  SmartCore::Container::DependencyCompatability::Registry.prevent_dependency_overlap!(
    self, namespace_name
  )
end
prevent_namespace_overlap!(dependency_name) click to toggle source

@param dependency_name [String] @return [void]

@api private @since 0.7.0

# File lib/smart_core/container/registry.rb, line 224
def prevent_namespace_overlap!(dependency_name)
  SmartCore::Container::DependencyCompatability::Registry.prevent_namespace_overlap!(
    self, dependency_name
  )
end
state_frozen?() click to toggle source

@return [Boolean]

@api private @since 0.7.0

# File lib/smart_core/container/registry.rb, line 101
def state_frozen?
  registry.frozen?
end
thread_safe(&block) click to toggle source

@param block [Proc] @return [Any]

@api private @since 0.7.0

# File lib/smart_core/container/registry.rb, line 246
def thread_safe(&block)
  @access_lock.thread_safe(&block)
end