Sha256: 0a25785a59ae683d97794dda0f8e9e86b52223b40681108097457f2f5dbba75c

Contents?: true

Size: 1.8 KB

Versions: 6

Compression:

Stored size: 1.8 KB

Contents

# frozen_string_literal: true

module ConvenientService
  module Services
    class RunOwnMethodInOrganizer
      module Errors
        class MethodForStepIsNotDefined < ConvenientService::Error
          def initialize(service_class:, method_name:)
            message = <<~TEXT
              Service #{service_class} tries to use `#{method_name}` method in a step, but it NOT defined.

              Did you forget to define it?
            TEXT

            super(message)
          end
        end
      end

      ##
      # @internal
      #   TODO: Reuse parent config?
      #
      include Configs::Standard

      attr_reader :method_name, :organizer, :kwargs

      def initialize(method_name:, organizer:, **kwargs)
        @method_name = method_name
        @organizer = organizer
        @kwargs = kwargs
      end

      def result
        raise Errors::MethodForStepIsNotDefined.new(service_class: organizer.class, method_name: method_name) unless own_method

        ##
        # NOTE: `kwargs` are intentionally NOT passed, since all the corresponding methods are available inside `own_method` body.
        #
        own_method.call
      end

      private

      ##
      # @return [Method, nil]
      #
      # @internal
      #   TODO: A possible bottleneck. Should be removed if receives negative feedback.
      #
      #   NOTE: `own_method.bind(organizer).call` is logically the same as `own_method.bind_call(organizer)`.
      #   - https://ruby-doc.org/core-2.7.1/UnboundMethod.html#method-i-bind_call
      #   - https://blog.saeloun.com/2019/10/17/ruby-2-7-adds-unboundmethod-bind_call-method.html
      #
      def own_method
        method = Utils::Module.get_own_instance_method(organizer.class, method_name, private: true)

        return unless method

        method.bind(organizer)
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
convenient_service-0.11.0 lib/convenient_service/services/run_own_method_in_organizer.rb
convenient_service-0.10.1 lib/convenient_service/services/run_own_method_in_organizer.rb
convenient_service-0.10.0 lib/convenient_service/services/run_own_method_in_organizer.rb
convenient_service-0.9.0 lib/convenient_service/services/run_own_method_in_organizer.rb
convenient_service-0.8.0 lib/convenient_service/services/run_own_method_in_organizer.rb
convenient_service-0.7.0 lib/convenient_service/services/run_own_method_in_organizer.rb