3 # http://majakari.net/2006/11/23/adding-plugins-to-your-ruby-application
4 # http://eigenclass.org/hiki.rb?ruby+plugins
10 alias tsort_each_node each_key
12 # hash values contain dependencies
13 def tsort_each_child(node, &block)
14 fetch(node, []).each(&block)
19 # allow accessing attributes using def_field
23 define_method(name) do |*args|
25 when 0: instance_variable_get("@#{name}")
26 else instance_variable_set("@#{name}", *args)
35 @registered_plugins = {}
37 attr_reader :registered_plugins
41 def self.extensions(ext_point)
42 plugins = Plugin.registered_plugins.select do |n,o|
43 o.extends == ext_point
47 plugins.each do |name,obj|
49 deps[name] = obj.run_after.to_s
51 if obj.run_before.respond_to?(:pop)
52 obj.run_before.each {|d| deps[d.to_s] = name}
54 deps[obj.run_before.to_s] = name
58 deps.tsort.map {|name| Plugin.registered_plugins[name]}
61 def self.define(name, &block)
63 p.instance_eval(&block)
64 Plugin.registered_plugins[name] = p
68 def_field :author, :version, :extends, :run_before, :run_after