This is a multi-part message in MIME format.
--------------040404030007060607000403
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit
gabriele renzi wrote:
> I need to write a sw in ruby that would allow people
> adding plug-in/modules
> to handle some event driven functions.
> I can think of two ways of doing this:
> -create a Plugin class, with methods that won't do
> nothing
This is not necessary in Ruby
> (actually, I suppose this could be a mix-in)
No, you don't even need a mix-in for that.
> I suppose this should work, but it seems that the last
> step is too long and complex, and
> anyway this approach would end calling a lot of null
> methods in any Plugin.
This is true : suboptimal.
> After all this raving I come to the question:
> is there some Rubish Right Way (TM) to write SW with
> plug-in support?
I think I have an extremely simple but useful callback-mechanism,
I send it in an attachment.
Usage :
You define a callback stack (instance of of CallbackStack)
for each of your event.
Your plugins can register a callback by calling the register
method with some block (The block will be executed if the
corresponding event occurs.)
Your application calls the call method of its callback stack
if the specified event occures.
That's all.
--------------040404030007060607000403
Content-Type: text/plain;
name
allbacks.rb"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename
allbacks.rb"
#!/usr/bin/env ruby
class CallbackStack
def initialize
@table }
@id
end
# You should give your callback a unique name (id)
# if you want to delete or overwrite it!
# The stack returns a unique id if you don't specify any (nil).
def add(proc l,id l)
if id
if proc
@table[id] roc
id
else
@table.delete(id)
end
else
if !proc
@table.clear
nil
else
@id+while @table[@id]
@table[@id] roc
@id
end
end
end
def call(*x)
for id,proc in @table
proc.call(*x)
end
end
def register(&block)
add(block)
end
# call it now + register
def always(&block)
block.call(self)
add(block)
end
end
--------------040404030007060607000403--