class Middleman::Extension

def activate

def activate
  new(::Middleman::Application)
end

def activated_extension(instance)

def activated_extension(instance)
  name = instance.class.extension_name
  return unless @_extension_activation_callbacks && @_extension_activation_callbacks[name]
  @_extension_activation_callbacks[name].each do |block|
    block.arity == 1 ? block.call(instance) : block.call
  end
end

def after_extension_activated(name, &block)

def after_extension_activated(name, &block)
  @_extension_activation_callbacks ||= {}
  @_extension_activation_callbacks[name] ||= []
  @_extension_activation_callbacks[name] << block if block_given?
end

def app=(app)

def app=(app)
  @app = app
  (self.class.defined_helpers || []).each do |m|
    app.class.send(:include, m)
  end
end

def bind_after_build

def bind_after_build
  ext = self
  return unless ext.respond_to?(:after_build)
  @klass.after_build do |builder|
    if ext.method(:after_build).arity == 1
      ext.after_build(builder)
    else
      ext.after_build
    end
  end
end

def bind_after_configuration

def bind_after_configuration
  ext = self
  @klass.after_configuration do
    ext.after_configuration if ext.respond_to?(:after_configuration)
    # rubocop:disable IfUnlessModifier
    if ext.respond_to?(:manipulate_resource_list)
      ext.app.sitemap.register_resource_list_manipulator(ext.class.extension_name, ext)
    end
  end
end

def bind_before_build

def bind_before_build
  ext = self
  return unless ext.respond_to?(:before_build)
  @klass.before_build do |builder|
    if ext.method(:before_build).arity == 1
      ext.before_build(builder)
    else
      ext.before_build
    end
  end
end

def bind_before_configuration

def bind_before_configuration
  ext = self
  return unless ext.respond_to?(:before_configuration)
  @klass.before_configuration do
    ext.before_configuration
  end
end

def clear_after_extension_callbacks

def clear_after_extension_callbacks
  @_extension_activation_callbacks = {}
end

def config

def config
  @_config ||= ::Middleman::Configuration::ConfigurationManager.new
end

def extension_name

def extension_name
  ext_name || name.underscore.split('/').last.to_sym
end

def helpers(*m, &block)

be used as helpers in a new module.
of this extension, or a block whose contents will all
This accepts either a list of modules to add on behalf
Add helpers to the global Middleman application.
def helpers(*m, &block)
  self.defined_helpers ||= []
  if block_given?
    mod = Module.new
    mod.module_eval(&block)
    m = [mod]
  end
  self.defined_helpers += m
end

def initialize(klass, options_hash={}, &block)

def initialize(klass, options_hash={}, &block)
  @_helpers = []
  @klass = klass
  setup_options(options_hash, &block)
  setup_app_reference_when_available
  # Bind app hooks to local methods
  bind_before_configuration
  bind_after_configuration
  bind_before_build
  bind_after_build
end

def option(key, default=nil, description=nil)

def option(key, default=nil, description=nil)
  config.define_setting(key, default, description)
end

def register(n=extension_name)

def register(n=extension_name)
  ::Middleman::Extensions.register(n, self)
end

def setup_app_reference_when_available

def setup_app_reference_when_available
  ext = self
  @klass.initialized do
    ext.app = self
  end
  @klass.instance_available do
    ext.app ||= self
  end
end

def setup_options(options_hash)

def setup_options(options_hash)
  @options = self.class.config.dup
  @options.finalize!
  options_hash.each do |k, v|
    @options[k] = v
  end
  yield @options if block_given?
end