document.write('<div class="ruby" style="font-family: monospace;"><br />');
document.write('<span style="color:#008000; font-style:italic;"># constants</span><br />');
document.write('OFF = <span style="color:#0000FF; font-weight:bold;">false</span>; ON = <span style="color:#0000FF; font-weight:bold;">true</span><br />');
document.write('<span style="color:#008000; font-style:italic;"># ok, I\'m laaaazy, so I type this just once</span><br />');
document.write('<span style="color:#9966CC; font-weight:bold;">module</span> Named<br />');
document.write('&nbsp; attr_accessor :name&nbsp; &nbsp;<span style="color:#008000; font-style:italic;"># getter + setter</span><br />');
document.write('&nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> initialize<span style="color:#006600; font-weight:bold;">&#40;</span>name<span style="color:#006600; font-weight:bold;">&#41;</span><br />');
document.write('&nbsp; &nbsp; @name=name<br />');
document.write('&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />');
document.write('<span style="color:#9966CC; font-weight:bold;">end</span><br />');
document.write('<br />');
document.write('<span style="color:#008000; font-style:italic;"># gosh, a switch! this one emits a signal labeld :switched</span><br />');
document.write('<span style="color:#9966CC; font-weight:bold;">class</span> SignalingSwitch <br />');
document.write('&nbsp; <span style="color:#9966CC; font-weight:bold;">include</span> Named <br />');
document.write('&nbsp; <span style="color:#9966CC; font-weight:bold;">include</span> Signaling<br />');
document.write('&nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> switch <br />');
document.write('&nbsp; &nbsp; <span style="color:#CC0066; font-weight:bold;">print</span> @name,<span style="color:#996600;">&quot; switched<span style="color:#000099;">\n</span>&quot;</span><br />');
document.write('&nbsp; &nbsp; emit :switched<br />');
document.write('&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />');
document.write('<span style="color:#9966CC; font-weight:bold;">end</span><br />');
document.write('<br />');
document.write('<span style="color:#008000; font-style:italic;"># something to switch.. a light!</span><br />');
document.write('<span style="color:#9966CC; font-weight:bold;">class</span> Light <br />');
document.write('&nbsp; <span style="color:#9966CC; font-weight:bold;">include</span> Named&nbsp; <br />');
document.write('&nbsp; @state=OFF <span style="color:#008000; font-style:italic;"># initial value </span><br />');
document.write('&nbsp; attr_accessor :state <span style="color:#008000; font-style:italic;"># getter + setter </span><br />');
document.write('<br />');
document.write('&nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> turn<span style="color:#006600; font-weight:bold;">&#40;</span>x=!@state<span style="color:#006600; font-weight:bold;">&#41;</span>&nbsp; <span style="color:#008000; font-style:italic;"># default: toggle</span><br />');
document.write('&nbsp; &nbsp; @state=x<br />');
document.write('&nbsp; &nbsp; <span style="color:#CC0066; font-weight:bold;">print</span> \' \',@name,\' turned \',<span style="color:#9966CC; font-weight:bold;">if</span> @state <span style="color:#9966CC; font-weight:bold;">then</span> <span style="color:#996600;">&quot;on&quot;</span> <span style="color:#9966CC; font-weight:bold;">else</span> <span style="color:#996600;">&quot;off&quot;</span> <span style="color:#9966CC; font-weight:bold;">end</span>,<span style="color:#996600;">&quot;<span style="color:#000099;">\n</span>&quot;</span><br />');
document.write('&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />');
document.write('<span style="color:#9966CC; font-weight:bold;">end</span><br />');
document.write('<br />');
document.write('<span style="color:#008000; font-style:italic;"># ok, let\'s roll. two lights</span><br />');
document.write('l1 = Light.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Light1&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />');
document.write('l2 = Light.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Light2&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />');
document.write('<br />');
document.write('<span style="color:#008000; font-style:italic;"># each light gets its own switch</span><br />');
document.write('s1 = SignalingSwitch.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Switch1&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />');
document.write('connect<span style="color:#006600; font-weight:bold;">&#40;</span>s1,:switched,l1,:turn<span style="color:#006600; font-weight:bold;">&#41;</span><br />');
document.write('s2 = SignalingSwitch.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Switch2&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />');
document.write('connect<span style="color:#006600; font-weight:bold;">&#40;</span>s2,:switched,l2,:turn<span style="color:#006600; font-weight:bold;">&#41;</span><br />');
document.write('&nbsp;</div><div class="ruby" style="font-family: monospace;"><br />');
document.write('s1.<span style="color:#9900CC;">switch</span><br />');
document.write('s1.<span style="color:#9900CC;">switch</span><br />');
document.write('s2.<span style="color:#9900CC;">switch</span><br />');
document.write('&nbsp;</div><div class="ruby" style="font-family: monospace;"><br />');
document.write('Switch1 switched<br />');
document.write('&nbsp; Light1 turned on<br />');
document.write('Switch1 switched<br />');
document.write('&nbsp; Light1 turned off<br />');
document.write('Switch2 switched<br />');
document.write('&nbsp; Light2 turned on<br />');
document.write('&nbsp;</div><div class="ruby" style="font-family: monospace;"><br />');
document.write('<span style="color:#008000; font-style:italic;"># add an all of all on switch as well</span><br />');
document.write('sOff = SignalingSwitch.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Switch all off&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />');
document.write('connect<span style="color:#006600; font-weight:bold;">&#40;</span>sOff,:switched,l1,:turn,OFF<span style="color:#006600; font-weight:bold;">&#41;</span><br />');
document.write('connect<span style="color:#006600; font-weight:bold;">&#40;</span>sOff,:switched,l2,:turn,OFF<span style="color:#006600; font-weight:bold;">&#41;</span><br />');
document.write('sOn = SignalingSwitch.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Switch all on&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />');
document.write('connect<span style="color:#006600; font-weight:bold;">&#40;</span>sOn,:switched,l1,:turn,ON<span style="color:#006600; font-weight:bold;">&#41;</span><br />');
document.write('connect<span style="color:#006600; font-weight:bold;">&#40;</span>sOn,:switched,l2,:turn,ON<span style="color:#006600; font-weight:bold;">&#41;</span><br />');
document.write('&nbsp;</div><div class="ruby" style="font-family: monospace;"><br />');
document.write('sOn.<span style="color:#9900CC;">switch</span><br />');
document.write('sOff.<span style="color:#9900CC;">switch</span><br />');
document.write('&nbsp;</div><div class="ruby" style="font-family: monospace;"><br />');
document.write('Switch all on switched<br />');
document.write('&nbsp; Light1 turned on<br />');
document.write('&nbsp; Light2 turned on<br />');
document.write('Switch all off switched<br />');
document.write('&nbsp; Light1 turned off<br />');
document.write('&nbsp; Light2 turned off<br />');
document.write('&nbsp;</div><div class="ruby" style="font-family: monospace;"><br />');
document.write('<span style="color:#008000; font-style:italic;"># Another Signals + Slots Implementation for Ruby (c) Axel Plinge 2006</span><br />');
document.write('<br />');
document.write('<span style="color:#008000; font-style:italic;"># in order to avoid eval(...) cascades, all signaling Objects</span><br />');
document.write('<span style="color:#008000; font-style:italic;"># have to \'include Signaling\' in order to be able to \'emit\'</span><br />');
document.write('<span style="color:#9966CC; font-weight:bold;">module</span> Signaling&nbsp; &nbsp;<br />');
document.write('&nbsp; <span style="color:#008000; font-style:italic;"># connect one of our signals to one someones slot i.e. method</span><br />');
document.write('&nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> connect<span style="color:#006600; font-weight:bold;">&#40;</span>signal,recipient,slot,*args<span style="color:#006600; font-weight:bold;">&#41;</span><br />');
document.write('&nbsp; &nbsp; @connections = Hash.<span style="color:#9900CC;">new</span> <span style="color:#9966CC; font-weight:bold;">unless</span> @connections<br />');
document.write('&nbsp; &nbsp; @connections<span style="color:#006600; font-weight:bold;">&#91;</span>signal<span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#9966CC; font-weight:bold;">unless</span> @connections<span style="color:#006600; font-weight:bold;">&#91;</span>signal<span style="color:#006600; font-weight:bold;">&#93;</span><br />');
document.write('&nbsp; &nbsp; @connections<span style="color:#006600; font-weight:bold;">&#91;</span>signal<span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">push</span> <span style="color:#006600; font-weight:bold;">&#91;</span>recipient.<span style="color:#9900CC;">method</span><span style="color:#006600; font-weight:bold;">&#40;</span>slot<span style="color:#006600; font-weight:bold;">&#41;</span>,args<span style="color:#006600; font-weight:bold;">&#93;</span><br />');
document.write('&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />');
document.write('&nbsp; <br />');
document.write('&nbsp; <span style="color:#008000; font-style:italic;"># emit :signal name =&gt; call associated method with args or default value</span><br />');
document.write('&nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> emit<span style="color:#006600; font-weight:bold;">&#40;</span>name,*args<span style="color:#006600; font-weight:bold;">&#41;</span><br />');
document.write('&nbsp; &nbsp; <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#9966CC; font-weight:bold;">if</span> !@connections<br />');
document.write('&nbsp; &nbsp; connected_slots =@connections<span style="color:#006600; font-weight:bold;">&#91;</span>name<span style="color:#006600; font-weight:bold;">&#93;</span><br />');
document.write('&nbsp; &nbsp; <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#9966CC; font-weight:bold;">if</span> !connected_slots<br />');
document.write('&nbsp; &nbsp; connected_slots.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> |slot|<br />');
document.write('&nbsp; &nbsp; &nbsp; slot<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">call</span><span style="color:#006600; font-weight:bold;">&#40;</span>*<span style="color:#006600; font-weight:bold;">&#40;</span>slot<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>+args<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#008000; font-style:italic;"># concatenate *args lists</span><br />');
document.write('&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />');
document.write('&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />');
document.write('<span style="color:#9966CC; font-weight:bold;">end</span><br />');
document.write('&nbsp; <br />');
document.write('<span style="color:#008000; font-style:italic;"># connect sender\'s signal to one recipient\'s slot i.e. method</span><br />');
document.write('<span style="color:#008000; font-style:italic;"># called by sender.emit signal,*emit_args</span><br />');
document.write('<span style="color:#008000; font-style:italic;">#</span><br />');
document.write('<span style="color:#008000; font-style:italic;"># if *args are given, recipient.slot(*args,*emit_args) will be invoked,</span><br />');
document.write('<span style="color:#008000; font-style:italic;"># otherwise the just the args from after the emit statement are used</span><br />');
document.write('<span style="color:#008000; font-style:italic;"># recipient.slot(*emit_args)</span><br />');
document.write('<span style="color:#9966CC; font-weight:bold;">def</span> connect<span style="color:#006600; font-weight:bold;">&#40;</span>sender,signal,recipient,slot,*args<span style="color:#006600; font-weight:bold;">&#41;</span><br />');
document.write('&nbsp; sender.<span style="color:#9900CC;">connect</span><span style="color:#006600; font-weight:bold;">&#40;</span>signal,recipient,slot,*args<span style="color:#006600; font-weight:bold;">&#41;</span><br />');
document.write('<span style="color:#9966CC; font-weight:bold;">end</span><br />');
document.write('&nbsp;</div>');
document.write('Modules in Ruby can be used as namespaces  in C++ or Java or, as I have done here, for multiple ineritance, just as interfaces are used in Java. Object.method(mehtod_name) gives and Method object with a method call to involke it. Since variable argument lists are arrays, we can concatenate them with + like any other array before unfolding them with *. ');
document.write('<br />&nbsp;<br /><div style="font-size: 12px">Brought to you by the community at <a href="http://www.bytemycode.com/snippets/snippet/275/1/" target="_blank">byteMyCode</a>.</div>');
