class Core::Extension::Behavior

public

Defines behavior that can be applied to objects. Behavior will only be applied to each object once by default.

force - If true, behavior will be applied even if it has already been applied to the including object.

Public Class Methods

conditional_keyword_arguments(arguments, callable) click to toggle source
# File lib/core/extension/behavior.rb, line 66
def conditional_keyword_arguments(arguments, callable)
  arguments.keep_if { |key, _value|
    callable.parameters.any? { |type, name|
      (type == :key || type == :keyreq || type == :keyrest) && name == key
    }
  }
end
new(force: false, &block) click to toggle source
# File lib/core/extension/behavior.rb, line 10
def initialize(force: false, &block)
  @force = force
  @module = build_module(&block)
end

Public Instance Methods

apply_extend(object) click to toggle source
public

Applies this behavior to an object via extend.

# File lib/core/extension/behavior.rb, line 17
def apply_extend(object)
  if force? || unapplied?(object)
    object.extend(@module)
  end
end
apply_include(object) click to toggle source
public

Applies this behavior to an object via include.

# File lib/core/extension/behavior.rb, line 25
def apply_include(object)
  if force? || unapplied?(object)
    object.include(@module)
  end
end

Private Instance Methods

applied?(object) click to toggle source
# File lib/core/extension/behavior.rb, line 39
        def applied?(object)
  object.ancestors.include?(@module)
end
build_module(&block) click to toggle source
# File lib/core/extension/behavior.rb, line 43
        def build_module(&block)
  Module.new {
    define_singleton_method(:extended) do |base|
      arguments = {
        extended: true,
        included: false
      }

      base.class_exec(**Behavior.conditional_keyword_arguments(arguments, block), &block)
    end

    define_singleton_method(:included) do |base|
      arguments = {
        extended: false,
        included: true
      }

      base.class_exec(**Behavior.conditional_keyword_arguments(arguments, block), &block)
    end
  }
end
force?() click to toggle source
# File lib/core/extension/behavior.rb, line 31
        def force?
  @force == true
end
unapplied?(object) click to toggle source
# File lib/core/extension/behavior.rb, line 35
        def unapplied?(object)
  !applied?(object)
end