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