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
  if 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
end

def bind_after_configuration

def bind_after_configuration
  ext = self
  @klass.after_configuration do
    if ext.respond_to?(:after_configuration)
      ext.after_configuration
    end
    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_configuration

def bind_before_configuration
  ext = self
  if ext.respond_to?(:before_configuration)
    @klass.before_configuration do
      ext.before_configuration
    end
  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
  self.ext_name || self.name.underscore.split("/").last.to_sym
end

def helpers(&block)

def helpers(&block)
  self.defined_helpers ||= []
  m = Module.new
  m.module_eval(&block)
  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_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=self.extension_name)

def register(n=self.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, &block)

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