class SmartCore::Initializer::AttributeDefiner
@api private @since 0.5.0
Attributes
@return [Class]
@api private @since 0.5.0
Public Class Methods
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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