Sha256: b89b7bec5133bfa8b2cb759105d38d7f842d7b21308ad69c5364252e4c339e04

Contents?: true

Size: 1.8 KB

Versions: 10

Compression:

Stored size: 1.8 KB

Contents

require 'dry-initializer'

module ROM
  # @api private
  module Initializer
    # @api private
    module DefineWithHook
      # @api private
      def param(*)
        super.tap { __define_with__ }
      end

      # @api private
      def option(*)
        super.tap do
          __define_with__ unless method_defined?(:with)
        end
      end

      # @api private
      def __define_with__
        seq_names = dry_initializer.
                      definitions.
                      reject { |_, d| d.option }.
                      keys.
                      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__ ||= self.class.dry_initializer.definitions.values.each_with_object({}) do |item, obj|
          obj[item.target] = instance_variable_get(item.ivar)
        end
      end

      define_method(:class, Kernel.instance_method(:class))
      define_method(:instance_variable_get, Kernel.instance_method(:instance_variable_get))

      # This makes sure we memoize options before an object becomes frozen
      #
      # @api public
      def freeze
        options
        super
      end
    end
  end
end

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
rom-core-4.2.1 lib/rom/initializer.rb
rom-core-4.2.0 lib/rom/initializer.rb
rom-core-4.1.2 lib/rom/initializer.rb
rom-core-4.1.1 lib/rom/initializer.rb
rom-core-4.1.0 lib/rom/initializer.rb
rom-core-4.0.2 lib/rom/initializer.rb
rom-core-4.0.1 lib/rom/initializer.rb
rom-core-4.0.0 lib/rom/initializer.rb
rom-core-4.0.0.rc2 lib/rom/initializer.rb
rom-core-4.0.0.rc1 lib/rom/initializer.rb