Module: RSwing::Components::Events::Event

Included in:
Module
Defined in:
lib/rswing/components/events/event.rb

Instance Method Summary collapse

Instance Method Details

#event_for(listener_class_method_hash) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/rswing/components/events/event.rb', line 24

def event_for(listener_class_method_hash)
  module_with_event = listener_class_method_hash.keys.first
  event_name = listener_class_method_hash.values.first

  event_listener_class = listener_class_method_hash.keys.last
  java_method_name = listener_class_method_hash.values.last

  module_with_event.module_eval do
    define_method("__real_#{event_name}") do |block, *args|
      self.send("add#{event_listener_class.java_class.name.split(".").last}", 
                Listener.create(event_listener_class, java_method_name, &block))
    end
  
    # some funky code here, since we need do define the interface-method
    # which will itself call our 'real' method. this is a workaround for ruby 1.8 since 
    # it isn't possible to define_method a method with a &block via define_method. should work in 1.9
    # but for now, we keep it this (obviously ugly) way, since it works. 
    eval "      def \#{event_name}(*args, &block)\n        __real_\#{event_name}(block, args)\n      end\n    EOM\n    \n  end\nend\n"