Module: Eco::Language::Delegation::DelegatingMissing::ClassMethods

Defined in:
lib/eco/language/delegation/delegating_missing.rb

Instance Method Summary collapse

Instance Method Details

#delegating_missing(*these, to:) ⇒ Object

Raises:

  • (ArgumentError)


16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/eco/language/delegation/delegating_missing.rb', line 16

def delegating_missing(*these, to:)
  msg = "Delegating to: should be String or Symbol. Given: #{to.class}"
  raise ArgumentError, msg unless sym_or_string?(to)

  these.map do |this|
    msg = "Expecting String or Symbol. Given: #{this}."
    raise ArgumentError, msg unless sym_or_string?(this)

    this.to_sym
  end.each do |this|
    _delegating_missing[this] = to
  end

  self
end

#delegating_missing?(sym) ⇒ Boolean

Returns:

  • (Boolean)


42
43
44
45
46
47
48
49
# File 'lib/eco/language/delegation/delegating_missing.rb', line 42

def delegating_missing?(sym)
  return true  if sym.nil? && delegating_missing_to
  return false unless sym_or_string?(sym)
  return true  if _delegating_missing.key?(sym.to_sym)
  return true  if delegating_missing_to

  false
end

#delegating_missing_target(instance, at: nil) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/eco/language/delegation/delegating_missing.rb', line 51

def delegating_missing_target(instance, at: nil)
  return unless delegating_missing?(at)
  return unless (subject_ref = _delegating_missing[at] || delegating_missing_to)

  instance_has_method =
    instance.methods.include?(subject_ref) ||
    instance.private_methods.include?(subject_ref)

  return instance.method(subject_ref).call if instance_has_method
  return                                   unless at.to_s.start_with?('@')
  return                                   unless instance.instance_variable_defined?(at)

  instance.instance_variable_get(at)
end

#delegating_missing_to(to = nil) ⇒ Object

Raises:

  • (ArgumentError)


32
33
34
35
36
37
38
39
40
# File 'lib/eco/language/delegation/delegating_missing.rb', line 32

def delegating_missing_to(to = nil)
  return @delegating_missing_to if to.nil?

  msg = "Expecting String or Symbol. Given: #{to}."
  raise ArgumentError, msg unless sym_or_string?(to)


  @delegating_missing_to = to.to_sym
end