class Wardrobe::BlockSetup

Attributes

block_options[R]
calling_klass[R]

Public Class Methods

create_array_method(name) click to toggle source
# File lib/wardrobe/block_setup.rb, line 82
def create_array_method(name)
  define_method(name) do |*values, &blk|
    begin
      block_options[name] ||= []
      block_options[name].push(*values)
      instance_exec(&blk) if blk || block_given?
    ensure
      block_options[name].pop(values.length)
      block_options.delete(name) if block_options[name].empty?
    end
  end
end
Also aliased as: create_set_method
create_boolean_method(name) click to toggle source
# File lib/wardrobe/block_setup.rb, line 110
def create_boolean_method(name)
  define_method(name) do |val = true, &blk|
    begin
      block_options[name] ||= []
      block_options[name] << val
      instance_exec(&blk) if blk || block_given?
    ensure
      block_options[name].pop
      block_options.delete(name) if block_options[name].empty?
    end
  end
end
create_hash_method(name) click to toggle source
# File lib/wardrobe/block_setup.rb, line 97
def create_hash_method(name)
  define_method(name) do |**args, &blk|
    begin
      block_options[name] ||= {}
      block_options[name].merge!(args)
      instance_exec(&blk) if blk || block_given?
    ensure
      args.keys.map { |key| block_options[name].delete(key) }
      block_options.delete(name) if block_options[name].empty?
    end
  end
end
create_set_method(name)
Alias for: create_array_method
new(calling_klass) click to toggle source
# File lib/wardrobe/block_setup.rb, line 7
def initialize(calling_klass)
  @calling_klass = calling_klass
  @block_options = {}
end
register_option(option) click to toggle source
# File lib/wardrobe/block_setup.rb, line 77
def register_option(option)
  return if option.klass == Proc || option.klass == Object
  send("create_#{option.klass_name}_method", option.name)
end

Public Instance Methods

attribute(name, klass, **keyargs, &blk) click to toggle source
# File lib/wardrobe/block_setup.rb, line 23
def attribute(name, klass, **keyargs, &blk)
  calling_klass.attribute(name, klass, **merged_options_for_attribute(keyargs), &blk)
end
attributes(**kargs, &blk) click to toggle source
# File lib/wardrobe/block_setup.rb, line 27
def attributes(**kargs, &blk)
  run(**kargs, &blk)
end
convert_to_array_if_not_array(result, key) click to toggle source
# File lib/wardrobe/block_setup.rb, line 70
def convert_to_array_if_not_array(result, key)
  return unless result[key] && !result[key].is_a?(Array)
  result[key] = [result[key]]
end
merge_array(result, key, value) click to toggle source
# File lib/wardrobe/block_setup.rb, line 53
def merge_array(result, key, value)
  convert_to_array_if_not_array(result, key)
  if result[key]
    value.dup + result[key]
  else
    value.dup
  end
end
merge_boolean(result, key, value) click to toggle source
# File lib/wardrobe/block_setup.rb, line 40
def merge_boolean(result, key, value)
  result[key] || value.last
end
merge_hash(result, key, value) click to toggle source
# File lib/wardrobe/block_setup.rb, line 62
def merge_hash(result, key, value)
  if result[key]
    result[key].merge(value)
  else
    value.dup
  end
end
merge_set(result, key, value) click to toggle source
# File lib/wardrobe/block_setup.rb, line 44
def merge_set(result, key, value)
  convert_to_array_if_not_array(result, key)
  if result[key]
    Set.new(value.dup + result[key])
  else
    Set.new(value.dup)
  end
end
merged_options_for_attribute(args) click to toggle source
# File lib/wardrobe/block_setup.rb, line 31
def merged_options_for_attribute(args)
  result = args.dup
  block_options.map do |k, v|
    option = Wardrobe.options[k]
    result[k] = send("merge_#{option.klass_name}", result, k, v)
  end
  result
end
run(**kargs, &blk) click to toggle source
# File lib/wardrobe/block_setup.rb, line 12
def run(**kargs, &blk)
  if (karg = kargs.first)
    kargs.delete(karg.first)
    send(*karg) do
      run(**kargs, &blk)
    end
  else
    instance_exec(&blk)
  end
end