Module: Extensible

Extended by:
ExtensionKernel
Defined in:
lib/extensible.rb,
lib/extensible/utils.rb,
lib/extensible/version.rb,
lib/extensible/extension_kernel.rb,
lib/extensible/extension_kernel_template.rb

Overview

Use Extensible on your custom extensions in order to get a set of advantages over traditional extensions that override the Module#extended method directly. When extending Extensible you will be able to define your initialization code (similar to using Module#extended) via the when_extended method.

module MyExtension
  extend Extensible
  when_extended {|m| puts "#{self} has extended #{m}." }
end

class MyClass
  extend MyExtension
end  #=> MyExtension has extended MyClass.

Extensible is, itself, extensible. This means that you will be able to extend it further or bundle it together with other extensible modules by including it in your module.

module MyExtensibleExtension
  include Extensible

  def custom_when_extended(&block)
    puts "Defining initialization code..."
    when_extended &block
  end
end

module MyExtension
  extend MyExtensibleExtension
  custom_when_extended {|m| puts "#{self} has extended #{m}." }
end  #=> Defining initialization code...

class MyClass
  extend MyExtension
end  #=> MyExtension has extended MyClass.

Defined Under Namespace

Modules: ExtensionKernelTemplate, Utils

Constant Summary collapse

VERSION =

Current version of Extensible.

"0.1.1".freeze
ExtensionKernel =

A custom ExtensionKernelTemplate clone that is extended by Extensible to make it, well, extensible.

ExtensionKernelTemplate.clone.module_eval do
  private

  def extended(submodule)
    super

    unless Utils.own_const_defined?(submodule, :ExtensionKernel)
      kernel = ExtensionKernelTemplate.clone
      submodule.const_set(:ExtensionKernel, kernel)
      submodule.extend kernel
    end

    self
  end

  self
end