decko-commons/decko

View on GitHub
card/lib/card/set/event/callbacks.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
93%
class Card
  module Set
    class Event
      module Callbacks
        def set_event_callbacks
          %i[before after around].each do |kind|
            next unless (object_method = @opts.delete kind)

            set_event_callback object_method, kind
          end
        end

        def set_event_callback object_method, kind
          valid_event_callback kind, object_method do
            Card.class_exec(self) do |event|
              set_callback object_method, kind, event.name,
                           prepend: true, if: proc { |c| c.event_applies?(event) }
            end
          end
        end

        def valid_event_callback kind, method
          yield
        rescue NoMethodError
          raise "invalid event callback: `#{kind}: #{method}`"
        end
      end
    end
  end
end