module ExtendIt::Dsl::ClassMethods

Public Class Methods

new(receiver) click to toggle source
# File lib/extend_it/dsl.rb, line 36
def initialize(receiver)
  if receiver.nil? || receiver.frozen?
    fail(ArgumentError, 'DSL receiver should be non-frozen object')
  end
  @dsl_receiver = receiver
end

Public Instance Methods

dsl(&block) click to toggle source
# File lib/extend_it/dsl.rb, line 29
def dsl(&block)
  if @dsl.nil?
    parent = superclass.respond_to?(:dsl) ? [superclass.dsl] : []
  end
  @dsl ||= Class.new(*parent) do
    extend DslMethods

    def initialize(receiver)
      if receiver.nil? || receiver.frozen?
        fail(ArgumentError, 'DSL receiver should be non-frozen object')
      end
      @dsl_receiver = receiver
    end

    private

    attr_reader :dsl_receiver

    def dsl_get(var_name, default = nil)
      var_name = var_name.ensure_symbol!(name_of: :instance_variable)
      if default.nil? && !block_given?
        fail(ArgumentError, '`default` or block should be specified')
      end
      if dsl_receiver.instance_variable_defined?(var_name)
        dsl_receiver.instance_variable_get(var_name)
      else
        default = yield if block_given?
        dsl_receiver.instance_variable_set(var_name, default)
      end
    end

    def dsl_set(var_name, value)
      var_name = var_name.ensure_symbol!(name_of: :instance_variable)
      setter_name = var_name.ensure_symbol!(name_of: :setter)
      if dsl_receiver.respond_to?(setter_name)
        dsl_receiver.send(setter_name, value)
      else
        dsl_receiver.instance_variable_set(var_name, value)
      end
    end
  end
  @dsl.class_eval(&block) if block_given?
  @dsl
end
dsl_get(var_name, default = nil) { || ... } click to toggle source
# File lib/extend_it/dsl.rb, line 47
def dsl_get(var_name, default = nil)
  var_name = var_name.ensure_symbol!(name_of: :instance_variable)
  if default.nil? && !block_given?
    fail(ArgumentError, '`default` or block should be specified')
  end
  if dsl_receiver.instance_variable_defined?(var_name)
    dsl_receiver.instance_variable_get(var_name)
  else
    default = yield if block_given?
    dsl_receiver.instance_variable_set(var_name, default)
  end
end
dsl_set(var_name, value) click to toggle source
# File lib/extend_it/dsl.rb, line 60
def dsl_set(var_name, value)
  var_name = var_name.ensure_symbol!(name_of: :instance_variable)
  setter_name = var_name.ensure_symbol!(name_of: :setter)
  if dsl_receiver.respond_to?(setter_name)
    dsl_receiver.send(setter_name, value)
  else
    dsl_receiver.instance_variable_set(var_name, value)
  end
end