Sha256: d885c1262a9bd61a834e81e4a322b3bd23e6850b9378ceeed917c09bda9ea523

Contents?: true

Size: 1.75 KB

Versions: 3

Compression:

Stored size: 1.75 KB

Contents

# frozen_string_literal: true

require 'dry/plugins/config'
require 'dry/plugins/registry/key_error'
require 'dry/plugins/registry/resolver'
require 'dry/plugins/plugin'
require 'dry-container'
require 'dry-equalizer'

module Dry
  module Plugins
    # Plug-in Registry
    class Registry
      include Dry::Container::Mixin
      include Dry::Equalizer(:_container, :config, :plugins)

      configure do |config|
        config.resolver = Resolver.new
      end

      # @param plugins [Module]
      def initialize(plugins)
        @require_path = Inflecto.underscore(plugins.to_s)
        @plugins = plugins
        super()
      end

      # @return [Module]
      attr_reader :plugins

      # @param key [#to_sym]
      # @param plugin [Module, Plugin]
      #
      # @return [Plugin]
      def register(key, plugin = nil)
        if key.is_a?(Module)
          plugin = key
          key = Inflecto.underscore(Inflecto.demodulize(plugin.name))
        end
        key = key.to_s
        plugin = plugin.plugin if plugin.is_a? Plugin
        if key?(key) && resolve(key) != plugin
          raise Registry::KeyError.new(self, key, plugin)
        end
        super key, plugin
      end

      # @param plugin [Module]
      # @param name [Symbol]
      #
      # @return [Plugin]
      def proxy(plugin, name: nil)
        Plugin.new(self, name, plugin)
      end

      # Resolve an item from the container
      #
      # @param name [Mixed]
      #   The key for the item you wish to resolve
      #
      # @return [Plugin]
      #
      # @api public
      def resolve(name)
        registry = self
        plugin = config.resolver.call(_container, name, @require_path)
        Plugin.new(registry, name, plugin)
      end

      # @!parse alias [] resolve
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
dry-plugins-0.4.0 lib/dry/plugins/registry.rb
dry-plugins-0.3.0 lib/dry/plugins/registry.rb
dry-plugins-0.2.0 lib/dry/plugins/registry.rb