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