Sha256: f601311002212cb19081c70e385d81ede11f0bb7eb4112827adcabc8e96dd0d1

Contents?: true

Size: 1.72 KB

Versions: 5

Compression:

Stored size: 1.72 KB

Contents

# frozen_string_literal: true

module EacRubyUtils
  class CommonConstructor
    class InstanceInitialize
      attr_reader :common_constructor, :args, :object, :block

      def initialize(common_constructor, args, object, block)
        @common_constructor = common_constructor
        @args = args
        @object = object
        @block = block
      end

      def perform
        validate_args_count
        object.run_callbacks :initialize do
          object_attributes_set
          object_block_set
          object_after_callback
        end
      end

      private

      def arg_value(arg_name)
        arg_index = common_constructor.args.index(arg_name)
        if arg_index < args.count
          args[arg_index]
        else
          common_constructor.default_values[arg_index - common_constructor.args_count_min]
        end
      end

      def object_after_callback
        return unless common_constructor.after_set_block

        object.instance_eval(&common_constructor.after_set_block)
      end

      def object_attribute_set(attr_name, attr_value)
        object.send("#{attr_name}=", attr_value)
      end

      def object_attributes_set
        common_constructor.args.each do |arg_name|
          object_attribute_set(arg_name, arg_value(arg_name))
        end
      end

      def object_block_set
        block_arg = common_constructor.block_arg
        object_attribute_set(block_arg, block) if block_arg
      end

      def validate_args_count
        return if common_constructor.args_count.include?(args.count)

        raise ArgumentError, "#{object.class}.initialize: wrong number of arguments " \
                             "(given #{args.count}, expected #{common_constructor.args_count})"
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 2 rubygems

Version Path
eac_ruby_utils-0.124.0 lib/eac_ruby_utils/common_constructor/instance_initialize.rb
eac_tools-0.97.2 sub/eac_ruby_utils/lib/eac_ruby_utils/common_constructor/instance_initialize.rb
eac_ruby_utils-0.123.0 lib/eac_ruby_utils/common_constructor/instance_initialize.rb
eac_ruby_utils-0.121.0 lib/eac_ruby_utils/common_constructor/instance_initialize.rb
eac_ruby_utils-0.120.0 lib/eac_ruby_utils/common_constructor/instance_initialize.rb