# Ruby Eventing

**URL:** <https://www.ruby-forum.com/t/ruby-eventing/76076>\
**Category:** Ruby\
**Created:** [December 26, 2005, 1:04am UTC](https://www.ruby-forum.com/t/ruby-eventing/76076 "2005-12-26T01:04:56Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Ronggen\_Pan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/dbc845/32.png) [@Ronggen\_Pan](https://www.ruby-forum.com/u/Ronggen_Pan)\
**Post date:** [December 26, 2005, 1:04am UTC](https://www.ruby-forum.com/t/ruby-eventing/76076/1 "2005-12-26T01:04:56Z")

</div>

Hi,

While working on a state machine work flow, I need a flexible way to  
define  
event/event handling. Since I came from C# background, so I have come up  
event.rb to share with everyone. Welcome for comments.

Here’s the example codes. You can get event.rb from  
[Competo Solutions, Inc. | Sharing our experience in ever changing tech landscapes](http://competo.com/code/event.rb).  
Thanks!  
class CoffeeMaker

include Event

def initialize

```
 event 'brew_ready'

 event 'brewing_started'

```

end

def brew

```
 on_brewing_started('new brew started')

 #brewing ...

 on_brew_ready('coffee is ready!')

```

end

end

class CoffeeLover

def get\_coffee(\*args)

puts “thanks for the coffee!”

end

end

cm = CoffeeMaker.new

cm.brewing\_started(‘+s1’) {|\*args| puts args}

cm.brew\_ready(‘+s2’) {|\*args| puts args}

cl = CoffeeLover.new

cm.brew\_ready(‘+s3’) {|\*args| cl.get\_coffee args} # add sink with +

cm.brew

cm.brew\_ready(‘-s3’) #remove sink with -

cm.brew

produces …

new brew started

thanks for the coffee!

coffee is ready!

new brew started

coffee is ready!

---

<div class="post-metadata">

**Author:** ![Ronggen\_Pan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/dbc845/32.png) [@Ronggen\_Pan](https://www.ruby-forum.com/u/Ronggen_Pan)\
**Post date:** [December 26, 2005, 8:10am UTC](https://www.ruby-forum.com/t/ruby-eventing/76076/2 "2005-12-26T08:10:17Z")

</div>

Here’s the latest [event.rb](http://competo.com/ruby/event.rb).

require ‘event’

class CoffeeMaker  
event :brew\_ready, :brewing\_started  
def brew  
on\_brewing\_started(‘new brew started’)  
#brewing …  
on\_brew\_ready(‘coffee is ready!’)  
end  
end

class CoffeeLover  
def get\_coffee(\*args)  
puts “thanks for the coffee!”  
end  
end

cm = CoffeeMaker.new  
cm.brewing\_started(‘+s1’) {|\*args| puts args}  
cm.brew\_ready(‘+s2’) {|\*args| puts args}  
cl = CoffeeLover.new  
cm.brew\_ready(‘+s3’) {|\*args| cl.get\_coffee args} # add sink with +  
cm.brew

cm.brew\_ready(‘-s3’) #remove sink with -  
cm.brew
