module ExtendIt::Dsl::DslMethods

Public Instance Methods

dsl_accessor(*names, default: nil, variable: nil, &setter) click to toggle source
# File lib/extend_it/dsl.rb, line 77
def dsl_accessor(*names, default: nil, variable: nil, &setter)
  names = names.ensure_array(:flatten, :compact, :uniq)
  variable = nil if names.size != 1
  variable = variable.ensure_symbol(name_of: :local)
  names.each do |name|
    name = name.ensure_symbol(name_of: :getter) || next
    setter_name = name.ensure_symbol(name_of: :setter) || next

    define_method setter_name do |*args|
      obj =
        if setter.nil?
          args.first || default
        else
          dsl_receiver.instance_exec(*args, &setter)
        end
      dsl_set(variable || name, obj)
    end

    define_method name do |*args, &block|
      obj = send(setter_name, *args)
      obj.dsl_eval(&block) if !block.nil? && obj.is_a?(Dsl)
      obj
    end
  end
end
dsl_block(*names, variable: nil) click to toggle source
# File lib/extend_it/dsl.rb, line 122
def dsl_block(*names, variable: nil)
  names = names.ensure_array(:flatten, :compact, :uniq)
  variable = nil if names.size != 1
  variable = variable.ensure_symbol(name_of: :local)
  names.each do |name|
    name = name.ensure_symbol(name_of: :getter) || next
    define_method name do |&block|
      return if block.nil?
      dsl_set(variable || name, block)
    end
  end
end
dsl_boolean(*names, default: true, variable: nil) click to toggle source
# File lib/extend_it/dsl.rb, line 103
def dsl_boolean(*names, default: true, variable: nil)
  default = default == true
  names = names.ensure_array(:flatten, :compact, :uniq)
  variable = nil if names.size != 1
  variable = variable.ensure_symbol(name_of: :local)
  names.each do |name|
    name = name.ensure_symbol(name_of: :getter) || next
    setter_name = name.ensure_symbol(name_of: :setter) || next

    define_method name do |value = nil|
      send(setter_name, value.nil? ? default : value)
    end

    define_method setter_name do |value = default|
      dsl_set(variable || name, value == true)
    end
  end
end
dsl_hash_of_objects(hash_name, variable: nil, single: nil, &creator) click to toggle source
# File lib/extend_it/dsl.rb, line 150
def dsl_hash_of_objects(hash_name, variable: nil, single: nil, &creator)
  unless block_given?
    fail(
      ArgumentError,
      '`dsl_hash_of_objects` requires creator block to be present'
    )
  end
  hash_name = hash_name.ensure_symbol!(name_of: :local)
  variable = variable.ensure_symbol(name_of: :local)

  unless single.nil?
    single = single.ensure_symbol!(name_of: :local)
    define_method single do |name, **opts, &block|
      name = name.ensure_symbol
      unless name.nil?
        hash = dsl_get(variable || hash_name, {})
        obj = hash[name] ||=
              dsl_receiver.instance_exec(name, **opts, &creator)
        obj.dsl_eval(&block) if !block.nil? && obj.is_a?(Dsl)
      end
    end
  end

  define_method hash_name do |*names, **opts, &block|
    hash = dsl_get(variable || hash_name, {})
    names = names.ensure_array(:flatten, :ensure_symbol, :compact, :uniq)
    Dsl.expand_asterisk(names, hash.keys).each do |name|
      obj = hash[name] ||=
            dsl_receiver.instance_exec(name, **opts, &creator)
      obj.dsl_eval(&block) if !block.nil? && obj.is_a?(Dsl)
    end
  end

  dsl_use_hash(hash_name, variable: variable)
end
dsl_use_hash(hash_name, variable: nil) click to toggle source
# File lib/extend_it/dsl.rb, line 135
def dsl_use_hash(hash_name, variable: nil)
  hash_name = hash_name.ensure_symbol!(name_of: :local)
  variable = variable.ensure_symbol(name_of: :local)

  define_method "use_#{hash_name}" do |*names, except: nil|
    hash = dsl_get(variable || hash_name, {})
    keys = hash.keys
    names = names.ensure_array(:flatten, :ensure_symbol, :compact, :uniq)
    names = Dsl.expand_asterisk(names, keys)
    names = names.empty? ? keys : names & keys
    names -= except.ensure_array(:flatten, :ensure_symbol, :compact, make: true)
    hash.replace(Hash[names.map { |n| [n, hash[n]] }])
  end
end