Module: BangNestedCaller
- Included in:
- BangNest, Tgui::Widget
- Defined in:
- lib/white_gold/convention/bang_nested_caller.rb
Instance Method Summary collapse
- #bang_method_missing(name, *a, **na, &b) ⇒ Object
- #bang_object_stack(root = true) ⇒ Object
- #bang_respond_to?(name) ⇒ Boolean
- #self! ⇒ Object
- #upon!(item, **na, &b) ⇒ Object
Instance Method Details
#bang_method_missing(name, *a, **na, &b) ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# File 'lib/white_gold/convention/bang_nested_caller.rb', line 6 def bang_method_missing name, *a, **na, &b return @bang_target.send(name, *a, **na, &b) if @bang_target && @bang_target.respond_to?(name) api_name = "api_bang_#{name[...-1]}".to_sym return send(api_name, *a, **na, &b) if respond_to? api_name setter = "#{name[...-1]}=".to_sym if respond_to? setter return send(setter, a) if !a.empty? return send(setter, na) if !na.empty? return send(setter, b) if block_given? return send(setter) end no_method_error = NoMethodError.new("undefined bang nested method `#{name}` for #{bang_object_stack.map(&:class).join("/")}") raise no_method_error end |
#bang_object_stack(root = true) ⇒ Object
28 29 30 31 32 33 34 |
# File 'lib/white_gold/convention/bang_nested_caller.rb', line 28 def bang_object_stack root = true stack = [] stack << self if root stack << @bang_target if @bang_target stack += @bang_target.bang_object_stack(false) if @bang_target&.respond_to? :bang_object_stack return stack end |
#bang_respond_to?(name) ⇒ Boolean
2 3 4 |
# File 'lib/white_gold/convention/bang_nested_caller.rb', line 2 def bang_respond_to? name name.end_with?("!") && (respond_to?("#{name[...-1]}=") || respond_to?("api_bang_#{name[...-1]}") || (@bang_target && @bang_target.respond_to?(name))) end |
#self! ⇒ Object
24 25 26 |
# File 'lib/white_gold/convention/bang_nested_caller.rb', line 24 def self! @bang_target&.respond_to?(:self!) ? @bang_target.self! : self end |
#upon!(item, **na, &b) ⇒ Object
37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/white_gold/convention/bang_nested_caller.rb', line 37 def upon! item, **na, &b na.each do |k, v| item.send("#{k}=", v) end if b @bang_target, original_bang_target = item, @bang_target b.call item @bang_target = original_bang_target end item end |