LINUX.ORG.RU

История изменений

Исправление 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