Class: Wardrobe::BlockSetup

Inherits:
Object
  • Object
show all
Defined in:
lib/wardrobe/block_setup.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(calling_klass) ⇒ BlockSetup



7
8
9
10
# File 'lib/wardrobe/block_setup.rb', line 7

def initialize(calling_klass)
  @calling_klass = calling_klass
  @block_options = {}
end

Instance Attribute Details

#block_optionsObject (readonly)

Returns the value of attribute block_options.



5
6
7
# File 'lib/wardrobe/block_setup.rb', line 5

def block_options
  @block_options
end

#calling_klassObject (readonly)

Returns the value of attribute calling_klass.



5
6
7
# File 'lib/wardrobe/block_setup.rb', line 5

def calling_klass
  @calling_klass
end

Class Method Details

.create_array_method(name) ⇒ Object Also known as: create_set_method



82
83
84
85
86
87
88
89
90
91
92
93
# 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

.create_boolean_method(name) ⇒ Object



110
111
112
113
114
115
116
117
118
119
120
121
# 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) ⇒ Object



97
98
99
100
101
102
103
104
105
106
107
108
# 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

.register_option(option) ⇒ Object



77
78
79
80
# 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

Instance Method Details

#attribute(name, klass, **keyargs, &blk) ⇒ Object



23
24
25
# 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) ⇒ Object



27
28
29
# File 'lib/wardrobe/block_setup.rb', line 27

def attributes(**kargs, &blk)
  run(**kargs, &blk)
end

#convert_to_array_if_not_array(result, key) ⇒ Object



70
71
72
73
# 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) ⇒ Object



53
54
55
56
57
58
59
60
# 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) ⇒ Object



40
41
42
# File 'lib/wardrobe/block_setup.rb', line 40

def merge_boolean(result, key, value)
  result[key] || value.last
end

#merge_hash(result, key, value) ⇒ Object



62
63
64
65
66
67
68
# 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) ⇒ Object



44
45
46
47
48
49
50
51
# 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) ⇒ Object



31
32
33
34
35
36
37
38
# 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) ⇒ Object



12
13
14
15
16
17
18
19
20
21
# 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