class SmartCore::Initializer::AttributeDefiner

@api private @since 0.5.0

Attributes

processed_klass[R]

@return [Class]

@api private @since 0.5.0

Public Class Methods

new(processed_klass) click to toggle source

@param processed_klass [Class] @return [void]

@api private @since 0.5.0

# File lib/smart_core/initializer/attribute_definer.rb, line 11
def initialize(processed_klass)
  @processed_klass = processed_klass
  @definition_lock = Mutex.new
end

Public Instance Methods

define_option(option_name, option_type = :__any__, **options) click to toggle source

@param option_name [Symbol, String] @param option_type [String, Symbol] @return [void]

@api private @since 0.5.0

# File lib/smart_core/initializer/attribute_definer.rb, line 53
def define_option(option_name, option_type = :__any__, **options)
  thread_safe do
    option = build_attribute(option_name, option_type, **options)
    prevent_intersection_with_already_defined_param(option)

    append_option(option)
  end
end
define_options(*option_names) click to toggle source

@param option_names [Array<String, Symbol>] @return [void]

@api private @since 0.5.0

# File lib/smart_core/initializer/attribute_definer.rb, line 67
def define_options(*option_names)
  thread_safe do
    options = option_names.map do |option_name|
      build_attribute(option_name).tap do |option|
        prevent_intersection_with_already_defined_param(option)
      end
    end

    options.each { |option| append_option(option) }
  end
end
define_param(param_name, param_type = :__any__, **options) click to toggle source

@param param_name [Symbol, String] @param param_type [String, Symbol] @return [void]

@api private @since 0.5.0

# File lib/smart_core/initializer/attribute_definer.rb, line 22
def define_param(param_name, param_type = :__any__, **options)
  thread_safe do
    parameter = build_attribute(param_name, param_type, **options)
    prevent_intersection_with_already_defined_option(parameter)
    append_parameter(parameter)
  end
end
define_params(*param_names) click to toggle source

@param param_names [Array<String, Symbol>] @return [void]

@api private @since 0.5.0

# File lib/smart_core/initializer/attribute_definer.rb, line 35
def define_params(*param_names)
  thread_safe do
    parameters = param_names.map do |param_name|
      build_attribute(param_name).tap do |parameter|
        prevent_intersection_with_already_defined_option(parameter)
      end
    end

    parameters.each { |parameter| append_parameter(parameter) }
  end
end

Private Instance Methods

append_option(option) click to toggle source

@param option [SmartCore::Initializer::Attribute] @return [void]

@api private @since 0.5.0

# File lib/smart_core/initializer/attribute_definer.rb, line 116
def append_option(option)
  processed_klass.__options__ << option
  processed_klass.send(:attr_reader, option.name)
  processed_klass.send(option.privacy, option.name)
end
append_parameter(parameter) click to toggle source

@param parameter [SmartCore::Initializer::Attribute] @return [void]

@api private @since 0.5.0

# File lib/smart_core/initializer/attribute_definer.rb, line 105
def append_parameter(parameter)
  processed_klass.__params__ << parameter
  processed_klass.send(:attr_reader, parameter.name)
  processed_klass.send(parameter.privacy, parameter.name)
end
build_attribute(attribute_name, attribute_type = :__any__, **attribute_options) click to toggle source

@param attribute_name [Symbol, String] @param attribute_type [String, Symbol] @param attribute_options [Hash<Symbol,Any>] @return [SmartCore::Initializer::Attribute]

@api private @since 0.5.0

# File lib/smart_core/initializer/attribute_definer.rb, line 94
def build_attribute(attribute_name, attribute_type = :__any__, **attribute_options)
  SmartCore::Initializer::Attribute::Builder.build(
    attribute_name, type: attribute_type, **attribute_options
  )
end
prevent_intersection_with_already_defined_option(parameter) click to toggle source

@param parameter [SmartCore::Initializer::Attribute] @return [void]

@raise [SmartCore::Initializer::OptionOverlapError]

@api private @since 0.5.0

# File lib/smart_core/initializer/attribute_definer.rb, line 129
def prevent_intersection_with_already_defined_option(parameter)
  if processed_klass.__options__.conflicts_with?(parameter)
    raise(
      SmartCore::Initializer::OptionOverlapError,
      "You have already defined option with name :#{parameter.name}"
    )
  end
end
prevent_intersection_with_already_defined_param(option) click to toggle source

@param option [SmartCore::Initializer::Attribute] @return [void]

@raise [SmartCore::Initializer::ParamOverlapError]

@api private @since 0.5.0

# File lib/smart_core/initializer/attribute_definer.rb, line 145
def prevent_intersection_with_already_defined_param(option)
  if processed_klass.__params__.conflicts_with?(option)
    raise(
      SmartCore::Initializer::ParamOverlapError,
      "You have already defined param with name :#{option.name}"
    )
  end
end
thread_safe(&block) click to toggle source

@param block [Proc] @return [Any]

@api private @since 0.5.0

# File lib/smart_core/initializer/attribute_definer.rb, line 159
def thread_safe(&block)
  @definition_lock.synchronize(&block)
end