Ravn::Actor::

MessageHandling module

This is a mixin that adds the core message-dispatch mechanism for Ravn event systems to an Actor.

After extending an Actor with MessageHandling, you can declare handlers for particular kinds of messages using the ::register_message_handler declaration:

class Acme::Object extend Ravn::Actor::MessageHandling

  def handle_gps_message( message )
      # ...handle messages from GPS
  end
  register_message_handler( 'net.gps.', 'sys.gps.', :handle_gps_message )

end

This will cause any message whose type begins with either prefix that is passed to the filter_down method to call the handler method before calling the extended class’s filter_down.

If there are several handlers, the handler associated with the longest matching prefix is called.

You can also declare the handler inline like so:

register_message_handler ‘net.gps.’, ‘sys.gps.’, def handle_gps_message( message ) # …handle messages from GPS end

Public Class Methods

extended( object )

Extension callback – decorate object with message handling.

# File lib/ravn/actor/message_handling.rb, line 51
def self::extended( object )
        super

        object.singleton_class.attr_accessor( :message_handlers )
        object.message_handlers = FFI::RadixTree::Tree.new

        if object.respond_to?( :prepend )
                object.prepend( InstanceMethods )
        else
                object.extend( InstanceMethods )
        end
end

Public Instance Methods

inherited( subclass )

Add the message-dispatch radix trie to each subclass.

# File lib/ravn/actor/message_handling.rb, line 66
def inherited( subclass )
        super

        subclass.instance_variable_set( :@message_handlers, FFI::RadixTree::Tree.new )
end
register_message_handler( *args )

Register a handler method for one or more message prefixes.

# File lib/ravn/actor/message_handling.rb, line 74
def register_message_handler( *args )
        handler, *prefixes = args.reverse

        raise ArgumentError, "no handler specified" unless handler && handler.respond_to?( :to_proc )
        raise ArgumentError, "no prefixes specified" if prefixes.empty?

        prefixes.each do |prefix|
                Loggability[ Ravn ].debug "Adding %p handler for %s events: %p" % [
                        self,
                        prefix,
                        handler
                ]
                self.message_handlers.push_or_update( prefix, handler )
        end
end