Sha256: aabda1350084b18100fbf031e5a5a26000eba4840cac9148575a4ad0eab57512

Contents?: true

Size: 1.34 KB

Versions: 3

Compression:

Stored size: 1.34 KB

Contents

require 'dry-initializer'

module ROM

  # @api private
  module Initializer
    # @api private
    module DefineWithHook
      def param(*)
        super

        __define_with__
      end

      def option(*)
        super

        __define_with__ unless method_defined?(:with)
      end

      def __define_with__
        seq_names = __initializer_mixin__.
                      instance_method(:__initialize__).
                      parameters.
                      select { |type, _| type == :req }.
                      map { |_, name| name }.
                      join(', ')

        seq_names << ', ' unless seq_names.empty?

        undef_method(:with) if method_defined?(:with)

        class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
          def with(new_options = EMPTY_HASH)
            if new_options.empty?
              self
            else
              self.class.new(#{ seq_names }options.merge(new_options))
            end
          end
        RUBY
      end
    end

    # @api private
    def self.extended(base)
      base.extend(Dry::Initializer[undefined: false])
      base.extend(DefineWithHook)
      base.include(InstanceMethods)
    end

    # @api private
    module InstanceMethods
      # Instance options
      #
      # @return [Hash]
      #
      # @api public
      def options
        @__options__
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
rom-core-4.0.0.beta3 lib/rom/initializer.rb
rom-core-4.0.0.beta2 lib/rom/initializer.rb
rom-core-4.0.0.beta1 lib/rom/initializer.rb