module RubyFeatures::Concern::ApplyTo

Private Class Methods

extended(base) click to toggle source
# File lib/ruby-features/concern/apply_to.rb, line 18
def self.extended(base)
  base.instance_variable_set(:@_applied_blocks, [])
end

Public Instance Methods

_apply(target, apply_to_definitions, conditions) click to toggle source
# File lib/ruby-features/concern/apply_to.rb, line 5
def _apply(target, apply_to_definitions, conditions)
  _with_instance_variable(:@_conditions, conditions) do
    _build_mixins(apply_to_definitions)
  end

  target_class = RubyFeatures::Utils.ruby_const_get(self, "::#{target}")

  _apply_methods(target_class)
  _apply_applied_blocks(target_class)
end

Private Instance Methods

_apply_applied_blocks(target_class) click to toggle source
# File lib/ruby-features/concern/apply_to.rb, line 69
def _apply_applied_blocks(target_class)
  @_applied_blocks.each do |applied_block|
    target_class.class_eval(&applied_block)
  end
end
_apply_methods(target_class) click to toggle source
# File lib/ruby-features/concern/apply_to.rb, line 40
def _apply_methods(target_class)
  target_class_methods = target_class.methods + target_class.private_methods
  target_instance_methods = target_class.instance_methods + target_class.private_instance_methods

  constants.each do |constant|
    mixin = const_get(constant)
    mixin_methods = mixin.instance_methods + mixin.private_instance_methods

    case(constant)
    when /^AddClassMethods/
      existing_methods = mixin_methods & target_class_methods
      raise NameError.new("Tried to add already existing class methods: #{existing_methods.inspect}") unless existing_methods.empty?
      target_class.send(:extend, mixin)

    when /^AddInstanceMethods/
      existing_methods = mixin_methods & target_instance_methods
      raise NameError.new("Tried to add already existing instance methods: #{existing_methods.inspect}") unless existing_methods.empty?
      target_class.send(:include, mixin)

    when /^RewriteInstanceMethods/
      not_existing_methods = mixin_methods - target_instance_methods
      raise NameError.new("Tried to rewrite not existing instance methods: #{not_existing_methods.inspect}") unless not_existing_methods.empty?
      target_class.send(:prepend, mixin)

    else raise ArgumentError.new("Wrong mixin constant: #{constant}")
    end
  end
end
_build_mixins(apply_to_definitions) click to toggle source
# File lib/ruby-features/concern/apply_to.rb, line 89
def _build_mixins(apply_to_definitions)
  apply_to_definitions.each do |apply_to_definition|
    global_asserts = @_conditions.normalize_asserts(apply_to_definition[:asserts])
    if @_conditions.match?(global_asserts)
      _with_instance_variable(:@_global_asserts, global_asserts) do
        class_eval(&apply_to_definition[:block])
      end
    end
  end
end
_methods(mixin_prefix, asserts, block) click to toggle source
# File lib/ruby-features/concern/apply_to.rb, line 75
def _methods(mixin_prefix, asserts, block)
  asserts = @_conditions.normalize_asserts(asserts)

  if @_conditions.match?(asserts)
    RubyFeatures::Utils.prepare_module(self, "#{mixin_prefix}#{@_conditions.build_constant_postfix(@_global_asserts, asserts)}").class_eval(&block)
  end
end
_with_instance_variable(variable_name, value) { || ... } click to toggle source
# File lib/ruby-features/concern/apply_to.rb, line 83
def _with_instance_variable(variable_name, value)
  instance_variable_set(variable_name, value)
  yield
  remove_instance_variable(variable_name)
end
applied(asserts = {}, &block) click to toggle source
# File lib/ruby-features/concern/apply_to.rb, line 22
def applied(asserts = {}, &block)
  if @_conditions.match?(asserts, false)
    @_applied_blocks << block
  end
end
class_methods(asserts = {}, &block) click to toggle source
# File lib/ruby-features/concern/apply_to.rb, line 28
def class_methods(asserts = {}, &block)
  _methods('AddClassMethods', asserts, block)
end
instance_methods(asserts = {}, &block) click to toggle source
# File lib/ruby-features/concern/apply_to.rb, line 32
def instance_methods(asserts = {}, &block)
  _methods('AddInstanceMethods', asserts, block)
end
rewrite_instance_methods(asserts = {}, &block) click to toggle source
# File lib/ruby-features/concern/apply_to.rb, line 36
def rewrite_instance_methods(asserts = {}, &block)
  _methods('RewriteInstanceMethods', asserts, block)
end