class SmartCore::Initializer::Constructor::Definer

@api private @since 0.1.0 rubocop:disable Metrics/ClassLength

Attributes

klass[R]

@return [Class]

@api private @since 0.1.0

Public Class Methods

new(klass) click to toggle source

@param klass [Class] @return [void]

@api private @since 0.1.0

# File lib/smart_core/initializer/constructor/definer.rb, line 12
def initialize(klass)
  @klass = klass
  @lock = SmartCore::Engine::Lock.new
end

Public Instance Methods

define_init_extension(block) click to toggle source

@param block [Proc] @return [void]

@api private @since 0.1.0

# File lib/smart_core/initializer/constructor/definer.rb, line 22
def define_init_extension(block)
  thread_safe do
    add_init_extension(build_init_extension(block))
  end
end
define_option( name, type, type_system, privacy, finalize, cast, read_only, as, dynamic_options ) click to toggle source

@param name [String, Symbol] @param type [String, Symbol, Any] @param type_system [String, Symbol] @param privacy [String, Symbol] @param finalize [String, Symbol, Proc] @param cast [Boolean] @param read_only [Boolean] @param as [String, Symbol, NilClass] @param dynamic_options [Hash<Symbol,Any>] @return [void]

@api private @since 0.1.0

# File lib/smart_core/initializer/constructor/definer.rb, line 109
def define_option(
  name,
  type,
  type_system,
  privacy,
  finalize,
  cast,
  read_only,
  as,
  dynamic_options
)
  thread_safe do
    attribute = build_attribute(
      name,
      type,
      type_system,
      privacy,
      finalize,
      cast,
      read_only,
      as,
      dynamic_options
    )
    prevent_parameter_overlap(attribute)
    add_option(attribute)
  end
end
define_options(*names) click to toggle source

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

@api private @since 0.1.0

# File lib/smart_core/initializer/constructor/definer.rb, line 142
def define_options(*names)
  thread_safe do
    names.map do |name|
      build_attribute(
        name,
        klass.__initializer_settings__.generic_type_object,
        klass.__initializer_settings__.type_system,
        SmartCore::Initializer::Attribute::Parameters::DEFAULT_PRIVACY_MODE,
        SmartCore::Initializer::Attribute::Parameters::DEFAULT_FINALIZER,
        SmartCore::Initializer::Attribute::Parameters::DEFAULT_CAST_BEHAVIOUR,
        SmartCore::Initializer::Attribute::Parameters::DEFAULT_READ_ONLY,
        SmartCore::Initializer::Attribute::Parameters::DEFAULT_AS,
        SmartCore::Initializer::Attribute::Parameters::DEFAULT_DYNAMIC_OPTIONS.dup
      ).tap do |attribute|
        prevent_parameter_overlap(attribute)
      end
    end.each do |attribute|
      add_option(attribute)
    end
  end
end
define_parameter( name, type, type_system, privacy, finalize, cast, read_only, as, dynamic_options ) click to toggle source

@param name [String, Symbol] @param type [String, Symbol, Any] @param type_system [String, Symbol] @param privacy [String, Symbol] @param finalize [String, Symbol, Proc] @param cast [Boolean] @param read_only [Boolean] @param as [String, Symbol, NilClass] @param dynamic_options [Hash<Symbol,Any>] @return [void]

@api private @since 0.1.0

# File lib/smart_core/initializer/constructor/definer.rb, line 41
def define_parameter(
  name,
  type,
  type_system,
  privacy,
  finalize,
  cast,
  read_only,
  as,
  dynamic_options
)
  thread_safe do
    attribute = build_attribute(
      name,
      type,
      type_system,
      privacy,
      finalize,
      cast,
      read_only,
      as,
      dynamic_options
    )
    prevent_option_overlap(attribute)
    add_parameter(attribute)
  end
end
define_parameters(*names) click to toggle source

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

@api private @since 0.1.0

# File lib/smart_core/initializer/constructor/definer.rb, line 74
def define_parameters(*names)
  thread_safe do
    names.map do |name|
      build_attribute(
        name,
        klass.__initializer_settings__.generic_type_object,
        klass.__initializer_settings__.type_system,
        SmartCore::Initializer::Attribute::Parameters::DEFAULT_PRIVACY_MODE,
        SmartCore::Initializer::Attribute::Parameters::DEFAULT_FINALIZER,
        SmartCore::Initializer::Attribute::Parameters::DEFAULT_CAST_BEHAVIOUR,
        SmartCore::Initializer::Attribute::Parameters::DEFAULT_READ_ONLY,
        SmartCore::Initializer::Attribute::Parameters::DEFAULT_AS,
        SmartCore::Initializer::Attribute::Parameters::DEFAULT_DYNAMIC_OPTIONS.dup
      ).tap do |attribute|
        prevent_option_overlap(attribute)
      end
    end.each do |attribute|
      add_parameter(attribute)
    end
  end
end

Private Instance Methods

add_init_extension(extension) click to toggle source

@param extension [SmartCore::Initializer::Extensions::ExtInit] @return [void]

@api private @since 0.1.0

# File lib/smart_core/initializer/constructor/definer.rb, line 237
def add_init_extension(extension)
  klass.__init_extensions__ << extension
end
add_option(option) click to toggle source

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

@api private @since 0.1.0

# File lib/smart_core/initializer/constructor/definer.rb, line 226
def add_option(option)
  klass.__options__ << option
  klass.send(:attr_reader, option.name)
  klass.send(option.privacy, option.name)
end
add_parameter(parameter) click to toggle source

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

@api private @since 0.1.0

# File lib/smart_core/initializer/constructor/definer.rb, line 215
def add_parameter(parameter)
  klass.__params__ << parameter
  klass.send(:attr_reader, parameter.name)
  klass.send(parameter.privacy, parameter.name)
end
build_attribute( name, type, type_system, privacy, finalize, cast, read_only, as, dynamic_options ) click to toggle source

@param name [String, Symbol] @param type [String, Symbol, Any] @param type_system [String, Symbol] @param privacy [String, Symbol] @param finalize [String, Symbol, Proc] @param cast [Boolean] @param read_only [Boolean] @param as [String, Symbol, NilClass] @param dynamic_options [Hash<Symbol,Any>] @return [SmartCore::Initializer::Attribute]

@api private @since 0.1.0

# File lib/smart_core/initializer/constructor/definer.rb, line 185
def build_attribute(
  name,
  type,
  type_system,
  privacy,
  finalize,
  cast,
  read_only,
  as,
  dynamic_options
)
  SmartCore::Initializer::Attribute::Factory.create(
    name, type, type_system, privacy, finalize, cast, read_only, as, dynamic_options
  )
end
build_init_extension(block) click to toggle source

@param block [Proc] @return [SmartCore::Initializer::Extensions::ExtInit]

@api private @since 0.1.0

# File lib/smart_core/initializer/constructor/definer.rb, line 206
def build_init_extension(block)
  SmartCore::Initializer::Extensions::ExtInit.new(block)
end
prevent_option_overlap(parameter) click to toggle source

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

@api private @since 0.1.0

# File lib/smart_core/initializer/constructor/definer.rb, line 246
  def prevent_option_overlap(parameter)
    if klass.__options__.include?(parameter)
      raise(SmartCore::Initializer::OptionOverlapError, <<~ERROR_MESSAGE)
        You have already defined option with name :#{parameter.name}
      ERROR_MESSAGE
    end
  end
prevent_parameter_overlap(option) click to toggle source

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

@api private @since 0.1.0

# File lib/smart_core/initializer/constructor/definer.rb, line 259
  def prevent_parameter_overlap(option)
    if klass.__params__.include?(option)
      raise(SmartCore::Initializer::ParameterOverlapError, <<~ERROR_MESSAGE)
        You have already defined parameter with name :#{option.name}
      ERROR_MESSAGE
    end
  end
thread_safe(&block) click to toggle source

@param block [Block] @return [Any]

@api private @since 0.1.0

# File lib/smart_core/initializer/constructor/definer.rb, line 272
def thread_safe(&block)
  @lock.synchronize(&block)
end