module Pakyow::Support::Extension

Makes it easier to define extensions.

@example

module SomeExtension
  extend Pakyow::Support::Extension

  # only allows the extension to be used on descendants of `SomeBaseClass`
  restrict_extension SomeBaseClass

  apply_extension do
    # anything here is evaluated on the object including the extension
  end

  class_methods do
    # class methods can be defined here
  end

  prepend_methods do
    # instance methods you wish to prepend can be defined here
  end

  # define instance-level methods as usual
end

class SomeClass < SomeBaseClass
  include SomeExtension
end

Public Instance Methods

apply_extension(&block) click to toggle source
# File lib/pakyow/support/extension.rb, line 39
def apply_extension(&block)
  @__extension_block = block
end
class_methods(&block) click to toggle source
# File lib/pakyow/support/extension.rb, line 43
def class_methods(&block)
  @__extension_extend_module = Module.new(&block)
end
included(base) click to toggle source
# File lib/pakyow/support/extension.rb, line 51
def included(base)
  enforce_restrictions(base)
  mixin_extension_modules(base)
  include_extensions(base)
end
prepend_methods(&block) click to toggle source
# File lib/pakyow/support/extension.rb, line 47
def prepend_methods(&block)
  @__extension_prepend_module = Module.new(&block)
end
restrict_extension(type) click to toggle source
# File lib/pakyow/support/extension.rb, line 35
def restrict_extension(type)
  @__extension_restriction = type
end

Private Instance Methods

enforce_restrictions(base) click to toggle source
# File lib/pakyow/support/extension.rb, line 59
def enforce_restrictions(base)
  if instance_variable_defined?(:@__extension_restriction) && !base.ancestors.include?(@__extension_restriction)
    raise StandardError, "expected `#{base}' to be `#{@__extension_restriction}'"
  end
end
include_extensions(base) click to toggle source
# File lib/pakyow/support/extension.rb, line 75
def include_extensions(base)
  if instance_variable_defined?(:@__extension_block)
    base.instance_exec(&@__extension_block)
  end
end
mixin_extension_modules(base) click to toggle source
# File lib/pakyow/support/extension.rb, line 65
def mixin_extension_modules(base)
  if instance_variable_defined?(:@__extension_extend_module)
    base.extend @__extension_extend_module
  end

  if instance_variable_defined?(:@__extension_prepend_module)
    base.prepend @__extension_prepend_module
  end
end