Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env ruby
- # .NET-style events in Ruby.
- require 'date'
- # BEGIN .NET-style events in Ruby
- class Event
- def initialize
- @event_handlers = {}
- end
- def add_handler(*event_handlers, &block)
- event_handlers.each do |event_handler|
- @event_handlers[event_handler.to_s] = event_handler
- end
- if block
- @event_handlers[block.to_s] = block
- block.to_s
- end
- end
- def remove_handler(*event_handlers)
- event_handlers.each do |event_handler|
- @event_handlers.delete(event_handler.to_s)
- end
- end
- def raise_event(sender, eventArgs)
- @event_handlers.each do |key, handler|
- Thread.new { handler.call(sender, eventArgs) }
- end
- end
- end
- class EventArgs
- @@empty = EventArgs.new
- def EventArgs.empty
- @@empty
- end
- end
- # END .NET-style events in Ruby
- # BEGIN More Ruby-like .NET-style events in Ruby
- module Events
- def self.included(base)
- base.extend ClassMethods
- end
- module ClassMethods
- def has_events *events
- events.each do |event|
- class_eval <<-"EOF"
- def on_#{event}(*handlers, &block)
- @#{event}_handlers ||= {}
- handlers.each do |handler|
- @#{event}_handlers[handler.to_s] = handler
- end
- if block
- @#{event}_handlers[block.to_s] = block
- return block.to_s
- end
- end
- def delete_#{event}(*handlers)
- handlers.each do |handler|
- @#{event}_handlers.delete(handler.to_s)
- end
- end
- protected
- def #{event}(*args)
- @#{event}_handlers ||= {}
- @#{event}_handlers.each do |key, handler|
- Thread.new { handler.call *args }
- end
- end
- EOF
- end
- end
- end
- end
- #END More Ruby-like .NET-style events in Ruby
- class FireAlarmActivatedEventArgs < EventArgs
- attr_reader :time
- attr_reader :room
- def initialize(time, room)
- @time = time
- @room = room
- end
- end
- class OldBuilding
- attr_reader :fire_alarm_activated
- def initialize
- @fire_alarm_activated = Event.new
- end
- def set_on_fire
- @fire_alarm_activated.raise_event self, FireAlarmActivatedEventArgs.new(DateTime.now, rand(60))
- end
- def evacuate
- puts "Evacuating building #{self.object_id}.\n"
- end
- end
- class NewBuilding
- include Events
- has_events :fire_alarm_activated, :sprinkler_activated
- def set_on_fire
- room = rand(60)
- fire_alarm_activated self, DateTime.now, room
- sprinkler_activated self, DateTime.now, room
- end
- end
- class Program
- def initialize
- @old_building = OldBuilding.new
- @new_building = NewBuilding.new
- end
- def on_fire_alarm_activated(sender, eventArgs)
- puts "Fire detected in building #{sender.object_id}, room #{eventArgs.room}, at #{eventArgs.time}.\n"
- puts "Calling fire department.\n"
- sender.evacuate
- end
- def main(*args)
- puts "\n"
- @old_building.fire_alarm_activated.add_handler method(:on_fire_alarm_activated)
- @old_building.fire_alarm_activated.add_handler { |sender, eventArgs| puts "It burns, it burns in room #{eventArgs.room}.\n" }
- @old_building.set_on_fire
- @new_building.on_fire_alarm_activated { |building, time, room| puts "Fire detected in building #{building.object_id}, room #{room}, at #{time}.\n" }
- @new_building.on_sprinkler_activated { |building, time, room| puts "Sprinkler activated in room #{room} at #{time}.\n" }
- @new_building.on_fire_alarm_activated { |building, time, room| puts "Evacuating bulding #{building.object_id}.\n" }
- 10.times do
- sleep 1;
- @new_building.set_on_fire
- end
- sleep 0.2
- puts "\n"
- end
- end
- Program.new().main()
- # This is an abomination. I know. Don't judge. It's just an example. Piss off.
Add Comment
Please, Sign In to add comment