Sha256: 5fec269fdc6c6b7344cc11a0e5f4aa9c65a67b74fa473da942e914b1bae4231b

Contents?: true

Size: 1.8 KB

Versions: 3

Compression:

Stored size: 1.8 KB

Contents

module Wamp
  module Client

    # Module that adds event capabilities to the class.
    #
    # Usage:
    #
    #   class MyClass
    #     include Event
    #
    #     create_event [:open, :close]
    #
    #     def do_something
    #       trigger :open, 4
    #     end
    #
    #   end
    #
    #   object = MyClass.new
    #
    #   object.on(:open) do |value|
    #     puts value
    #   end
    #
    #   object.do_something
    #
    # Prints:
    #
    #   4
    #
    module Event

      def self.included(base)
        base.extend(ClassMethods)
      end

      module ClassMethods
        def create_event(events, attribute: nil, setter: nil, trigger: nil)
          attribute ||= :event
          setter ||= :on
          trigger ||= :trigger

          # Create the attributes
          callback_name = "#{attribute}_callbacks"
          event_list_name = "#{attribute}_list"

          # Creates the attribute to store the callbacks
          attr_accessor callback_name

          # Creates the attributes to store the allowed events
          define_method event_list_name do
            events
          end

          # Creates the setter.  Default: "on"
          define_method setter do |event, &handler|
            unless self.send(event_list_name).include?(event)
              raise RuntimeError, "unknown #{setter}(event) '#{event}'"
            end

            callback = self.send(callback_name) || {}
            callback[event] = handler
            self.send("#{callback_name}=", callback)
          end

          # Create the trigger.  Default: "trigger"
          define_method trigger do |event, *args|
            handler = (self.send(callback_name) || {})[event]
            if handler != nil
              handler.call(*args)
            end
          end
        end
      end

    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
wamp_client-0.2.2 lib/wamp/client/event.rb
wamp_client-0.2.1 lib/wamp/client/event.rb
wamp_client-0.2.0 lib/wamp/client/event.rb