On Mon, May 26, 2008 at 11:56 AM, Kimmo Lehto <kimmo.lehto / gmail.com> wrote: > Any ideas how to do something like this..? > > I'd like to drop new parsers into a plugin-directory of my app without > making modifications to the main app, so there would be something like: > > # main.rb: > require 'plugins/*' > parsed_data = Parser.parse_data(data_goes_here) > > # plugins/foo.rb: > class FooParser < Parser > handles /^foo/ > def parse_data(data) > data.do_something if data.match(@handles) > end > end > > # plugins/bar.rb: > class BarParser < Parser > handles /^bar/ > def parse_data(data) > data.do_something if data.match(@handles) > end > end > > Then if I wanted to add a new parser i would just throw it in there with > the rest. Perhaps some sort of "register_handler"-call in each plugin? I think you already have it. The "handles" method could be implemented to register every handler, and then instantiate a child parser based on which handler the data matches. You would need to move the "if data.match..." part to the parent Parser class. Something like: class Parser @handlers = {} class << self attr_accessor :handlers def handles reg Parser.handlers[reg] = self end def parse_data data handler = @handlers.keys.find {|x| data.match(x)} raise "No parser found for #{data}" unless handler parser = @handlers[handler] parser.new.parse_data data end end end class FooParser < Parser handles /^foo/ def parse_data data puts "FooParser parsing #{data}" end end class BarParser < Parser handles /^bar/ def parse_data data puts "BarParser parsing #{data}" end end Hope this helps, Jesus.