Sha256: 6b7f18a7186630bad0ed3c6bdda5b0f78af08e8acef8e815105d4829a6fd95c9

Contents?: true

Size: 1.89 KB

Versions: 1

Compression:

Stored size: 1.89 KB

Contents

# frozen_string_literal: true

unless "".respond_to?(:safe_constantize)
  require "active_delivery/ext/string_constantize"
  using ActiveDelivery::Ext::StringConstantize
end

module ActiveDelivery
  module Lines
    class Base
      attr_reader :id, :options
      attr_accessor :owner
      attr_accessor :handler_class_name

      def initialize(id:, owner:, **options)
        @id = id
        @owner = owner
        @options = options.tap(&:freeze)
        @resolver = options[:resolver]
      end

      def dup_for(new_owner)
        self.class.new(id:, **options, owner: new_owner)
      end

      def resolve_class(name)
        resolver&.call(name)
      end

      def notify?(method_name)
        handler_class&.respond_to?(method_name)
      end

      def notify_now(handler, mid, ...)
      end

      def notify_later(handler, mid, ...)
      end

      def notify(mid, *args, params:, sync:, **kwargs)
        clazz = params.empty? ? handler_class : handler_class.with(**params)
        sync ? notify_now(clazz, mid, *args, **kwargs) : notify_later(clazz, mid, *args, **kwargs)
      end

      def handler_class
        if ::ActiveDelivery.cache_classes
          return @handler_class if instance_variable_defined?(:@handler_class)
        end

        return @handler_class = nil if owner.abstract_class?

        superline = owner.superclass.delivery_lines[id] if owner.superclass.respond_to?(:delivery_lines) && owner.superclass.delivery_lines[id]

        # If an explicit class name has been specified somewhere in the ancestor chain, use it.
        class_name = @handler_class_name || superline&.handler_class_name

        @handler_class =
          if class_name
            class_name.is_a?(Class) ? class_name : class_name.safe_constantize
          else
            resolve_class(owner) || superline&.handler_class
          end
      end

      private

      attr_reader :resolver
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
active_delivery-1.0.0.rc2 lib/active_delivery/lines/base.rb