Module: BangNestedCaller

Included in:
BangNest, Tgui::Widget
Defined in:
lib/white_gold/convention/bang_nested_caller.rb

Instance Method Summary collapse

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

Returns:



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