Module: Aux::Pluggable::ClassMethods

Defined in:
lib/aux/pluggable/class_methods.rb

Overview

Describes methods that would be inherited by pluggable classes

Instance Method Summary collapse

Instance Method Details

#new(*positional_arguments, **keyword_arguments) ⇒ Object

Create a new instance of the class that includes the Pluggable module rubocop:disable Metrics/AbcSize, Metrics/MethodLength

Parameters:

  • positional_arguments (Array<Object>)
  • keyword_arguments (Hash{Symbol => Object})

Returns:

  • (Object)


13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/aux/pluggable/class_methods.rb', line 13

def new(*positional_arguments, **keyword_arguments)
  instance = allocate

  # Configure some local variables for shorter calls
  # @type [Aux::Pluggable::Connector]
  pluggable = instance.class.instance_variable_get(:@_pluggable)
  dependencies_keys = pluggable.dependencies.map(&:pointer)

  # Configure dependencies that come from the registry
  pluggable.dependencies.each do |dependency|
    instance.instance_variable_set(:"@#{dependency.pointer}", dependency.target)

    # The next lines are required to make resolved dependencies available
    # by its reader methods within customized initialization
    #
    # TODO: Discuss whether this is appropriate behaviour
    next if instance.respond_to?(dependency.pointer, true)

    define_method(dependency.pointer) { instance_variable_get(:"@#{dependency.pointer}") }
    next unless dependency.private

    private(dependency.pointer)
  end

  # Configure dependencies that come from the customized initialization procedure
  dependencies_overrides = keyword_arguments.slice(*dependencies_keys)
  dependencies_overrides.each do |pointer, target|
    instance.instance_variable_set(:"@#{pointer}", target)
  end

  # Run the origin's initialization procedure if any other arguments given
  additional_keyword_arguments = keyword_arguments.reject { |key, _value| dependencies_keys.include?(key) }

  # TODO: Consider checks like positional_arguments.any? or additional_keyword_arguments.any?
  instance.send(:initialize, *positional_arguments, **additional_keyword_arguments)

  instance
end

#register(initialize: false, memoize: false, scope: true, as: nil) ⇒ Object

Parameters:

  • initialize (TrueClass, FalseClass) (defaults to: false)
  • memoize (TrueClass, FalseClass) (defaults to: false)
  • scope (Symbol, String, TrueClass, nil) (defaults to: true)
  • as (Symbol, String, nil) (defaults to: nil)


57
58
59
# File 'lib/aux/pluggable/class_methods.rb', line 57

def register(initialize: false, memoize: false, scope: true, as: nil)
  @_pluggable.register(initialize, memoize, scope, as)
end

#resolve(code, initialization_block = nil, scope: true, private: true, as: nil) ⇒ Object

Parameters:

  • code (Symbol, String)
  • initialization_block (Proc, nil) (defaults to: nil)
  • scope (TrueClass, Symbol, String, nil) (defaults to: true)
  • private (TrueClass, FalseClass) (defaults to: true)
  • as (Symbol, String, nil) (defaults to: nil)


66
67
68
# File 'lib/aux/pluggable/class_methods.rb', line 66

def resolve(code, initialization_block = nil, scope: true, private: true, as: nil)
  @_pluggable.resolve(code, scope, private, as, initialization_block)
end