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