Theme -> Plugin.
[kaya.git] / lib / plugins / loader.rb
blobc78b8e55008104ef61b0f8e57c0ad88e1253087e
1 class PluginLoader
2   BASE_DIR = File.dirname(__FILE__)
3   
4   class NoPluginFound < Exception
5   end
6   
7   def initialize
8     # load all ruby files in subdirectories
9     Dir[File.join(BASE_DIR, '*')].each do |f|
10       if File.directory?(f)
11         Dir[File.join(f, '*.rb')].each do |rb_file|
12           require rb_file
13         end
14       end
15     end
16     
17     @plugins = {}
18     ObjectSpace::each_object(Class) do |k|
19       if k.include?(Plugin) and k.plugin_name
20         @plugins[k.plugin_name] = k
21       end
22     end
23     
24   end
25   
26   def each(&blk)
27     @plugins.each_value(&blk)
28   end
29   
30   def get_matching(required, optional = [])
31     plugins = @plugins.values.
32       reject {|x| not x.matches?(required) }.
33       sort_by {|x| x.score(optional) }
34     raise NoPluginFound if plugins.empty?
35     plugins.last
36   end
37 end