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.