История изменений
Исправление theNamelessOne, (текущая версия) :
Не задавался раньше таким вопросом, но можно объявить абстрактный класс Plugin и навешать на него хук inherited, который будет регистрировать дочерние классы:
config.rb:
class Configuration
@@plugins = []
def self.register(plugin)
@@plugins << plugin
end
def self.start_plugins
@@plugins.each do |plugin|
plugin.new.start
end
end
end
class Plugin
# Magic goes here!!!
def self.inherited(subclass)
Configuration.register subclass
end
def start
raise NotImplementedError.new 'Should have been implemented in order to declare a plugin'
end
end
Dir[File.dirname(__FILE__) + '/plugins/*.rb'].each { |f| require f}
Configuration.start_plugins
plugins/a.rb:
class A < Plugin
def start
puts "Hello, #{self.class}"
end
end
plugins/b.rb:
class B < Plugin
def start
puts "Hello, #{self.class}"
end
end
Исходная версия theNamelessOne, :
Не задавался раньше таким вопросом, но можно объявить абстрактный класс Plugin, навешать на него хук inherited, который будет регистрировать дочерние классы:
config.rb:
class Configuration
@@plugins = []
def self.register(plugin)
@@plugins << plugin
end
def self.start_plugins
@@plugins.each do |plugin|
plugin.new.start
end
end
end
class Plugin
# Magic goes here!!!
def self.inherited(subclass)
Configuration.register subclass
end
def start
raise NotImplementedError.new 'Should have been implemented in order to declare a plugin'
end
end
Dir[File.dirname(__FILE__) + '/plugins/*.rb'].each { |f| require f}
Configuration.start_plugins
plugins/a.rb:
class A < Plugin
def start
puts "Hello, #{self.class}"
end
end
plugins/b.rb:
class B < Plugin
def start
puts "Hello, #{self.class}"
end
end