Guest User

Untitled

a guest
Jul 20th, 2018
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.58 KB | None | 0 0
  1. #!/usr/bin/env ruby
  2. # .NET-style events in Ruby.
  3.  
  4. require 'date'
  5.  
  6. # BEGIN .NET-style events in Ruby
  7. class Event
  8. def initialize
  9. @event_handlers = {}
  10. end
  11. def add_handler(*event_handlers, &block)
  12. event_handlers.each do |event_handler|
  13. @event_handlers[event_handler.to_s] = event_handler
  14. end
  15. if block
  16. @event_handlers[block.to_s] = block
  17. block.to_s
  18. end
  19. end
  20. def remove_handler(*event_handlers)
  21.  
  22. event_handlers.each do |event_handler|
  23. @event_handlers.delete(event_handler.to_s)
  24. end
  25. end
  26.  
  27. def raise_event(sender, eventArgs)
  28. @event_handlers.each do |key, handler|
  29. Thread.new { handler.call(sender, eventArgs) }
  30. end
  31. end
  32. end
  33.  
  34. class EventArgs
  35. @@empty = EventArgs.new
  36. def EventArgs.empty
  37. @@empty
  38. end
  39. end
  40.  
  41. # END .NET-style events in Ruby
  42.  
  43. # BEGIN More Ruby-like .NET-style events in Ruby
  44. module Events
  45. def self.included(base)
  46. base.extend ClassMethods
  47. end
  48. module ClassMethods
  49. def has_events *events
  50. events.each do |event|
  51. class_eval <<-"EOF"
  52. def on_#{event}(*handlers, &block)
  53. @#{event}_handlers ||= {}
  54. handlers.each do |handler|
  55. @#{event}_handlers[handler.to_s] = handler
  56. end
  57. if block
  58. @#{event}_handlers[block.to_s] = block
  59. return block.to_s
  60. end
  61. end
  62. def delete_#{event}(*handlers)
  63. handlers.each do |handler|
  64. @#{event}_handlers.delete(handler.to_s)
  65. end
  66. end
  67. protected
  68. def #{event}(*args)
  69. @#{event}_handlers ||= {}
  70. @#{event}_handlers.each do |key, handler|
  71. Thread.new { handler.call *args }
  72. end
  73. end
  74. EOF
  75. end
  76. end
  77. end
  78. end
  79. #END More Ruby-like .NET-style events in Ruby
  80.  
  81.  
  82. class FireAlarmActivatedEventArgs < EventArgs
  83. attr_reader :time
  84. attr_reader :room
  85. def initialize(time, room)
  86. @time = time
  87. @room = room
  88. end
  89. end
  90.  
  91. class OldBuilding
  92. attr_reader :fire_alarm_activated
  93. def initialize
  94. @fire_alarm_activated = Event.new
  95. end
  96. def set_on_fire
  97. @fire_alarm_activated.raise_event self, FireAlarmActivatedEventArgs.new(DateTime.now, rand(60))
  98. end
  99. def evacuate
  100. puts "Evacuating building #{self.object_id}.\n"
  101. end
  102. end
  103.  
  104. class NewBuilding
  105. include Events
  106. has_events :fire_alarm_activated, :sprinkler_activated
  107.  
  108. def set_on_fire
  109. room = rand(60)
  110. fire_alarm_activated self, DateTime.now, room
  111. sprinkler_activated self, DateTime.now, room
  112. end
  113. end
  114.  
  115. class Program
  116. def initialize
  117. @old_building = OldBuilding.new
  118. @new_building = NewBuilding.new
  119. end
  120. def on_fire_alarm_activated(sender, eventArgs)
  121. puts "Fire detected in building #{sender.object_id}, room #{eventArgs.room}, at #{eventArgs.time}.\n"
  122. puts "Calling fire department.\n"
  123. sender.evacuate
  124. end
  125. def main(*args)
  126. puts "\n"
  127. @old_building.fire_alarm_activated.add_handler method(:on_fire_alarm_activated)
  128. @old_building.fire_alarm_activated.add_handler { |sender, eventArgs| puts "It burns, it burns in room #{eventArgs.room}.\n" }
  129. @old_building.set_on_fire
  130.  
  131. @new_building.on_fire_alarm_activated { |building, time, room| puts "Fire detected in building #{building.object_id}, room #{room}, at #{time}.\n" }
  132. @new_building.on_sprinkler_activated { |building, time, room| puts "Sprinkler activated in room #{room} at #{time}.\n" }
  133. @new_building.on_fire_alarm_activated { |building, time, room| puts "Evacuating bulding #{building.object_id}.\n" }
  134. 10.times do
  135. sleep 1;
  136. @new_building.set_on_fire
  137. end
  138. sleep 0.2
  139. puts "\n"
  140. end
  141. end
  142.  
  143. Program.new().main()
  144.  
  145. # This is an abomination. I know. Don't judge. It's just an example. Piss off.
Add Comment
Please, Sign In to add comment