Class | Webgen::Blackboard |
In: |
lib/webgen/blackboard.rb
|
Parent: | Object |
A blackboard object provides two features for inter-object communication:
For a list of all available services and messages have a look at the main Webgen documentation page.
Create a new Blackboard object.
# File lib/webgen/blackboard.rb, line 20 20: def initialize 21: @listener = {} 22: @services = {} 23: end
Add the callable_object or the given block as listener for the messages msg_names (one message name or an array of message names).
# File lib/webgen/blackboard.rb, line 27 27: def add_listener(msg_names = nil, callable_object = nil, &block) 28: callable_object = callable_object || block 29: if !callable_object.nil? 30: raise ArgumentError, "The listener needs to respond to 'call'" unless callable_object.respond_to?(:call) 31: [msg_names].flatten.compact.each {|name| (@listener[name] ||= []) << callable_object} 32: else 33: raise ArgumentError, "You have to provide a callback object or a block" 34: end 35: end
Add a service named service_name provided by the callable_object or a block to the blackboard.
# File lib/webgen/blackboard.rb, line 52 52: def add_service(service_name, callable_object = nil, &block) 53: callable_object = callable_object || block 54: if @services.has_key?(service_name) 55: raise "The service name '#{service_name}' is already taken" 56: else 57: raise ArgumentError, "An object providing a service needs to respond to 'call'" unless callable_object.respond_to?(:call) 58: @services[service_name] = callable_object 59: end 60: end
Remove the given object from the dispatcher queues of the message names specified in msg_names.
# File lib/webgen/blackboard.rb, line 39 39: def del_listener(msg_names, callable_object) 40: [msg_names].flatten.each {|name| @listener[name].delete(callable_object) if @listener[name]} 41: end
Delete the service service_name.
# File lib/webgen/blackboard.rb, line 63 63: def del_service(service_name) 64: @services.delete(service_name) 65: end
Dispatch the message msg_name to all listeners for this message, passing the given arguments.
# File lib/webgen/blackboard.rb, line 45 45: def dispatch_msg(msg_name, *args) 46: return unless @listener[msg_name] 47: @listener[msg_name].each {|obj| obj.call(*args)} 48: end
Invoke the service called service_name with the given arguments.
# File lib/webgen/blackboard.rb, line 68 68: def invoke(service_name, *args, &block) 69: if @services.has_key?(service_name) 70: @services[service_name].call(*args, &block) 71: else 72: raise ArgumentError, "No such service named '#{service_name}' available" 73: end 74: end