Class: Cura::Event::Handler
- Inherits:
-
Object
- Object
- Cura::Event::Handler
- Defined in:
- lib/cura/event/handler.rb
Overview
The event handler. Each Component as well as several other class’s instances have an instance of this handler. The handler can have multiple callbacks defined for an arbitrary event name.
Instance Attribute Summary collapse
-
#callbacks ⇒ Hash<Symbol,Array>
readonly
The callbacks defined on this handler.
-
#host ⇒ Object
readonly
Get the object this handler is attached to.
Instance Method Summary collapse
-
#handle(event) ⇒ Object
Run all callbacks registered on this instance for the given event.
-
#initialize(host) ⇒ Handler
constructor
A new instance of Handler.
-
#register(event_name = :default, *arguments, &block) ⇒ Object
Add a callback to the event chain.
Constructor Details
#initialize(host) ⇒ Handler
Returns a new instance of Handler.
10 11 12 13 14 15 |
# File 'lib/cura/event/handler.rb', line 10 def initialize(host) raise TypeError, "host must be a Cura::Attributes::HasEvents" unless host.is_a?(Cura::Attributes::HasEvents) @host = host @callbacks = { default: [] } end |
Instance Attribute Details
#callbacks ⇒ Hash<Symbol,Array> (readonly)
The callbacks defined on this handler. Key is the event name and the value is an Array of Proc instances.
26 27 28 |
# File 'lib/cura/event/handler.rb', line 26 def callbacks @callbacks end |
#host ⇒ Object (readonly)
Get the object this handler is attached to.
20 21 22 |
# File 'lib/cura/event/handler.rb', line 20 def host @host end |
Instance Method Details
#handle(event) ⇒ Object
Run all callbacks registered on this instance for the given event. The event object is given as a block argument to the callbacks. TODO: These should be able to break the callback chain by returning false in the callback (which would also break the delegation chain). TODO: The event should be delegated to the host’s #parent if there are no callbacks registered for it, if it responds to #parent, and it’s not nil.
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/cura/event/handler.rb', line 39 def handle(event) callbacks = @callbacks[:default] + @callbacks[event.class.name].to_a chain_broken = false callbacks.each do |callback| result = host.instance_exec(event, *callback[:arguments], &callback[:block]) # TODO: Optional event consumption if result == false # chain_broken = true # TODO TODO TODO TODO TODO break end end delegate_event(event) unless chain_broken end |
#register(event_name = :default, *arguments, &block) ⇒ Object
Add a callback to the event chain. The first registered callback will be the first one called (FIFO). If no event_name is given, the callback is registered to the ‘:default` name, which are called before all others.
31 32 33 |
# File 'lib/cura/event/handler.rb', line 31 def register(event_name=:default, *arguments, &block) (@callbacks[event_name] ||= []) << { block: block, arguments: arguments } end |