class SmartCore::Initializer::InstanceBuilder
@api private @since 0.5.0
Attributes
@return [Hash<Symbol,Any>]
@api private @since 0.5.0
@return [Array<Any>]
@api private @since 0.5.0
@return [Class]
@api private @since 0.5.0
@return [Any]
@api private @since 0.5.0
Public Class Methods
@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
@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
@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
@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
@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
@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
@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
@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
@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
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