class SmartCore::Initializer::InstanceBuilder

@api private @since 0.5.0

Attributes

options[R]

@return [Hash<Symbol,Any>]

@api private @since 0.5.0

parameters[R]

@return [Array<Any>]

@api private @since 0.5.0

processed_klass[R]

@return [Class]

@api private @since 0.5.0

processed_object[R]

@return [Any]

@api private @since 0.5.0

Public Class Methods

call(processed_object, processed_klass, parameters, options) click to toggle source

@param processed_object [Any] @param processed_klass [Class] @param parameters [Array<Any>] @param options [Hash<Symbol,Any>] @return [Any] Fully allocated processed_object

@api private @since 0.5.0

# File lib/smart_core/initializer/instance_builder.rb, line 15
def call(processed_object, processed_klass, parameters, options)
  new(processed_object, processed_klass, parameters, options).call
end
new(processed_object, processed_klass, parameters, options) click to toggle source

@param processed_object [Any] @param processed_klass [Class] @param parameters [Array<Any>] @param options [Hash<Symbol,Any>] @return [void]

@api private @since 0.5.0

# File lib/smart_core/initializer/instance_builder.rb, line 28
def initialize(processed_object, processed_klass, parameters, options)
  @processed_object = processed_object
  @processed_klass = processed_klass
  @parameters = parameters
  @options = options
end

Public Instance Methods

call() click to toggle source

@return [Any]

@api private @since 0.5.0

# File lib/smart_core/initializer/instance_builder.rb, line 39
def call
  processed_object.tap do
    prevent_parameters_incomparability
    initialize_parameters
    initialize_options
    call_original_methods
    invoke_additional_initialization_steps
  end
end

Private Instance Methods

call_original_methods() click to toggle source

@return [void]

@api private @since 0.5.0

# File lib/smart_core/initializer/instance_builder.rb, line 161
def call_original_methods
  processed_object.send(:initialize, *parameters, **options)
end
initialize_options() click to toggle source

@return [void]

@api private @since 0.5.0

# File lib/smart_core/initializer/instance_builder.rb, line 135
def initialize_options
  processed_klass.__options__.each do |option|
    option_name  = option.name
    option_value = options.fetch(option_name) { option.default_value }.tap do |value|
      option.validate_value_type!(value)
    end
    final_option_value = option.finalize(option_value, processed_object)

    processed_object.instance_variable_set("@#{option_name}", final_option_value)
  end
end
initialize_parameters() click to toggle source

@return [void]

@api private @since 0.5.0

# File lib/smart_core/initializer/instance_builder.rb, line 120
def initialize_parameters
  parameter_objects = processed_klass.__params__
  parameter_pairs   = Hash[parameter_objects.zip(parameters)]

  parameter_pairs.each_pair do |parameter_object, parameter_value|
    parameter_object.validate_value_type!(parameter_value)
    final_parameter_value = parameter_object.finalize(parameter_value, processed_object)
    processed_object.instance_variable_set("@#{parameter_object.name}", final_parameter_value)
  end
end
invoke_additional_initialization_steps() click to toggle source

@return [void]

@api private @since 0.5.0

# File lib/smart_core/initializer/instance_builder.rb, line 151
def invoke_additional_initialization_steps
  processed_klass.__initialization_extensions__.each do |extension|
    extension.call(processed_object)
  end
end
prevent_parameters_incomparability() click to toggle source

@return [void]

@raise [SmartCore::Initializer::AttributeError] @raise [SmartCore::Initializer::ParameterError] @raise [SmartCore::Initializer::OptionError]

@api private @since 0.5.0

# File lib/smart_core/initializer/instance_builder.rb, line 101
def prevent_parameters_incomparability
  raise(
    SmartCore::Initializer::ParameterError,
    "Wrong number of parameters " \
    "(given #{parameters.size}, expected #{required_attributes_count})"
  ) unless parameters.size == required_attributes_count

  missing_options = required_options.reject { |option| options.key?(option) }

  raise(
    SmartCore::Initializer::OptionError,
    "Missing options: :#{missing_options.join(', :')}"
  ) unless missing_options.empty?
end
required_attributes_count() click to toggle source

@return [Integer]

@api private @since 0.5.0

# File lib/smart_core/initializer/instance_builder.rb, line 89
def required_attributes_count
  processed_klass.__params__.size
end
required_options() click to toggle source

An array of the required option attribute names (parameters without default values)

@return [Array<Symbol>]

@api private @since 0.5.0

# File lib/smart_core/initializer/instance_builder.rb, line 81
def required_options
  processed_klass.__options__.each.reject(&:has_default_value?).map(&:name)
end