class PhusionPassenger::Plugin
def self.call_hook(name, *args, &block)
def self.call_hook(name, *args, &block) last_result = nil if (hooks_list = @@hooks[name]) hooks_list.each do |callback| last_result = callback.call(*args, &block) end end return last_result end
def self.load(name, load_once = true)
def self.load(name, load_once = true) PLUGIN_DIRS.each do |plugin_dir| if plugin_dir =~ /\A~/ # File.expand_path uses ENV['HOME'] which we don't want. home = Etc.getpwuid(Process.uid).dir plugin_dir = plugin_dir.sub(/\A~/, home) end plugin_dir = File.expand_path(plugin_dir) Dir["#{plugin_dir}/*/#{name}.rb"].each do |filename| if load_once require(filename) else load(filename) end end end end
def self.register(name, klass)
def self.register(name, klass) classes = (@@classes[name] ||= []) classes << klass end
def self.register_hook(name, &block)
def self.register_hook(name, &block) hooks_list = (@@hooks[name] ||= []) hooks_list << block end
def call_hook(name, *args, &block)
def call_hook(name, *args, &block) last_result = nil if @instances @instances.each do |instance| if instance.respond_to?(name.to_sym) last_result = instance.__send__(name.to_sym, *args, &block) end end end return last_result end
def initialize(name, *args, &block)
def initialize(name, *args, &block) Plugin.load(name) classes = @@classes[name] if classes @instances = classes.map do |klass| klass.new(*args, &block) end else return nil end end