Sha256: 2d99adf076dcb470c4fda886d159f535d0f5f6b295b0a32792aba183873ce332

Contents?: true

Size: 1.02 KB

Versions: 2

Compression:

Stored size: 1.02 KB

Contents

module Prpr
  module Handler
    class Base
      class Entry < Struct.new(:klass, :event, :queries, :handler)
      end

      AnyEvent = Object

      class << self
        def handle(event, queries = {}, &handler)
          entries << Entry.new(self, event, queries, handler)
        end

        def entries
          @@entries ||= []
        end

        def on_event(event)
          entries
            .select { |entry| match?(entry, event) }
            .each { |entry| invoke(entry, event) }
        end

        private

        def match?(entry, event)
          entry.event === event &&
            entry.queries.all? { |query| query_match?(query, event) }
        end

        def query_match?(query, event)
          key, value = *query
          value === event.send(key)
        end

        def invoke(entry, event)
          obj = entry.klass.new(event)
          obj.instance_eval(&entry.handler)
        end
      end

      attr_reader :event
      def initialize(event)
        @event = event
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
prpr-0.2.0 lib/prpr/handler/base.rb
prpr-0.1.0 lib/prpr/handler/base.rb