module Dry::Core::Extensions

Define extensions that can be later enabled by the user.

@example

class Foo
  extend Dry::Core::Extensions

  register_extension(:bar) do
     def bar; :bar end
  end
end

Foo.new.bar # => NoMethodError
Foo.load_extensions(:bar)
Foo.new.bar # => :bar

Public Class Methods

extended(obj) click to toggle source

@api private

Calls superclass method
# File lib/dry/core/extensions.rb, line 25
def self.extended(obj)
  super
  obj.instance_variable_set(:@__available_extensions__, {})
  obj.instance_variable_set(:@__loaded_extensions__, Set.new)
end

Public Instance Methods

available_extension?(name) click to toggle source

Whether an extension is available

@param [Symbol] name extension name @return [Boolean] Extension availability

# File lib/dry/core/extensions.rb, line 43
def available_extension?(name)
  @__available_extensions__.key?(name)
end
load_extensions(*extensions) click to toggle source

Enables specified extensions. Already enabled extensions remain untouched

@param [Array<Symbol>] extensions list of extension names

# File lib/dry/core/extensions.rb, line 50
def load_extensions(*extensions)
  extensions.each do |ext|
    block = @__available_extensions__.fetch(ext) do
      raise ArgumentError, "Unknown extension: #{ext.inspect}"
    end
    unless @__loaded_extensions__.include?(ext)
      block.call
      @__loaded_extensions__ << ext
    end
  end
end
register_extension(name, &block) click to toggle source

Register an extension

@param [Symbol] name extension name @yield extension block. This block guaranteed not to be called more than once

# File lib/dry/core/extensions.rb, line 35
def register_extension(name, &block)
  @__available_extensions__[name] = block
end