Sha256: b2c2934a334389edde43fcbe70450e592e591bd04b4e5e3e751886fcc2593c84

Contents?: true

Size: 1.39 KB

Versions: 6

Compression:

Stored size: 1.39 KB

Contents

# frozen_string_literal: true

class Serega
  # Module in which all Serega plugins should be stored
  module Plugins
    @plugins = {}

    class << self
      #
      # Registers given plugin to be able to load it using symbol name.
      #
      # @example Register plugin
      #   Serega::Plugins.register_plugin(:plugin_name, PluginModule)
      def register_plugin(name, mod)
        @plugins[name] = mod
      end

      #
      # Loads plugin code and returns plugin core module.
      #
      # @param name [Symbol, Module] plugin name or plugin itself
      #
      # @raise [Error] Raises Error when plugin was not found
      #
      # @example Find plugin when providing name
      #   Serega::Plugins.find_plugin(:presenter) # => Serega::Plugins::Presenter
      #
      # @example Find plugin when providing plugin itself
      #   Serega::Plugins.find_plugin(Presenter) # => Presenter
      #
      # @return [Class<Module>] Plugin core module
      #
      def find_plugin(name)
        return name if name.is_a?(Module)
        return @plugins[name] if @plugins.key?(name)

        require_plugin(name)

        @plugins[name] || raise(Error, "Plugin '#{name}' did not register itself correctly")
      end

      private

      def require_plugin(name)
        require "serega/plugins/#{name}/#{name}"
      rescue LoadError
        raise Error, "Plugin '#{name}' does not exist"
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
serega-0.1.5 lib/serega/plugins.rb
serega-0.1.4 lib/serega/plugins.rb
serega-0.1.3 lib/serega/plugins.rb
serega-0.1.2 lib/serega/plugins.rb
serega-0.1.1 lib/serega/plugins.rb
serega-0.1.0 lib/serega/plugins.rb