Sha256: 8a8a28b7d870d47236c55a7b763789155f278ca27b4188b34029cb60d02454c9

Contents?: true

Size: 1.89 KB

Versions: 1

Compression:

Stored size: 1.89 KB

Contents

# frozen_string_literal: true

require 'clowne/utils/clone_mapper'

module Clowne
  module Utils
    class Operation # :nodoc: all
      THREAD_KEY = :"#{name}.clowne_operation"
      DEFAULT_MAPPER = Utils::CloneMapper

      private_constant :THREAD_KEY

      class << self
        def current
          Thread.current[THREAD_KEY]
        end

        def wrap(mapper: nil)
          return yield if current

          Thread.current[THREAD_KEY] = new(mapper || DEFAULT_MAPPER.new)

          current.tap do |operation|
            operation.clone = yield
            clear!
          end
        end

        def clear!
          Thread.current[THREAD_KEY] = nil
        end
      end

      attr_writer :clone
      attr_reader :mapper

      def initialize(mapper)
        @after_clone_blocks = []
        @after_persist_blocks = []
        @mapper = mapper
      end

      def add_after_persist(block)
        @after_persist_blocks.unshift(block)
      end

      def add_after_clone(block)
        @after_clone_blocks.unshift(block)
      end

      def add_mapping(origin, clone)
        @mapper.add(origin, clone)
      end

      def to_record
        return @_record if defined?(@_record)

        run_after_clone
        @_record = @clone
      end

      def persist!
        to_record.save!.tap do
          run_after_persist
        end
      end

      def persist
        to_record.save.tap do |result|
          next unless result

          run_after_persist
        end
      end

      def save
        warn '[DEPRECATION] `save` is deprecated.  Please use `persist` instead.'
        @clone.save
      end

      def save!
        warn '[DEPRECATION] `save!` is deprecated.  Please use `persist!` instead.'
        @clone.save!
      end

      def run_after_persist
        @after_persist_blocks.each(&:call)
      end

      def run_after_clone
        @after_clone_blocks.each(&:call)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
clowne-1.1.0 lib/clowne/utils/operation.rb