Class: Wardrobe::BlockSetup
- Inherits:
-
Object
- Object
- Wardrobe::BlockSetup
- Defined in:
- lib/wardrobe/block_setup.rb
Instance Attribute Summary collapse
-
#block_options ⇒ Object
readonly
Returns the value of attribute block_options.
-
#calling_klass ⇒ Object
readonly
Returns the value of attribute calling_klass.
Class Method Summary collapse
- .create_array_method(name) ⇒ Object (also: create_set_method)
- .create_boolean_method(name) ⇒ Object
- .create_hash_method(name) ⇒ Object
- .register_option(option) ⇒ Object
Instance Method Summary collapse
- #attribute(name, klass, **keyargs, &blk) ⇒ Object
- #attributes(**kargs, &blk) ⇒ Object
- #convert_to_array_if_not_array(result, key) ⇒ Object
-
#initialize(calling_klass) ⇒ BlockSetup
constructor
A new instance of BlockSetup.
- #merge_array(result, key, value) ⇒ Object
- #merge_boolean(result, key, value) ⇒ Object
- #merge_hash(result, key, value) ⇒ Object
- #merge_set(result, key, value) ⇒ Object
- #merged_options_for_attribute(args) ⇒ Object
- #run(**kargs, &blk) ⇒ Object
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 = {} end |
Instance Attribute Details
#block_options ⇒ Object (readonly)
Returns the value of attribute block_options.
5 6 7 |
# File 'lib/wardrobe/block_setup.rb', line 5 def end |
#calling_klass ⇒ Object (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 [name] ||= [] [name].push(*values) instance_exec(&blk) if blk || block_given? ensure [name].pop(values.length) .delete(name) if [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 [name] ||= [] [name] << val instance_exec(&blk) if blk || block_given? ensure [name].pop .delete(name) if [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 [name] ||= {} [name].merge!(args) instance_exec(&blk) if blk || block_given? ensure args.keys.map { |key| [name].delete(key) } .delete(name) if [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, **(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 (args) result = args.dup .map do |k, v| option = Wardrobe.[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 |