Module: Net::IMAP::Config::AttrInheritance

Included in:
Net::IMAP::Config
Defined in:
lib/net/imap/config/attr_inheritance.rb

Overview

NOTE: The public methods on this module are part of the stable public API of Net::IMAP::Config. But the module itself is an internal implementation detail, with no guarantee of backward compatibility.

attr_accessor methods will delegate to their #parent when the local value does not contain an override. Inheritance forms a singly linked list, so lookup will be O(n) on the number of ancestors. In practice, the ancestor chain is not expected to be long. Without customization, it is only three deep:

IMAP#config → Config.global → Config.default

When creating a client with the config keyword, for example to use the appropriate defaults for an application or a library while still relying on global for configuration of debug or logger, most likely the ancestor chain is still only four deep:

IMAP#config → alternate defaults → Config.global → Config.default

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#parentObject (readonly)

The parent Config object



46
47
48
# File 'lib/net/imap/config/attr_inheritance.rb', line 46

def parent
  @parent
end

Class Method Details

.attr_accessor(name) ⇒ Object

:nodoc: internal API



39
40
41
42
43
# File 'lib/net/imap/config/attr_inheritance.rb', line 39

def self.attr_accessor(name) # :nodoc: internal API
  module_eval <<~RUBY, __FILE__, __LINE__ + 1
    def #{name}; (val = super) == INHERITED ? parent&.#{name} : val end
  RUBY
end

Instance Method Details

#inherited?(attr) ⇒ Boolean

Returns true if attr is inherited from #parent and not overridden by this config.

Returns:

  • (Boolean)


59
# File 'lib/net/imap/config/attr_inheritance.rb', line 59

def inherited?(attr) data[attr] == INHERITED end

#initialize(parent = nil) ⇒ Object

:notnew:



48
49
50
51
52
# File 'lib/net/imap/config/attr_inheritance.rb', line 48

def initialize(parent = nil) # :notnew:
  super()
  @parent = Config[parent]
  reset
end

#new(**attrs) ⇒ Object

Creates a new config, which inherits from self.



55
# File 'lib/net/imap/config/attr_inheritance.rb', line 55

def new(**attrs) self.class.new(self, **attrs) end

#reset(attr = nil) ⇒ Object

:call-seq:

reset -> self
reset(attr) -> attribute value

Resets an attr to inherit from the #parent config.

When attr is nil or not given, all attributes are reset.



68
69
70
71
72
73
74
75
76
77
78
# File 'lib/net/imap/config/attr_inheritance.rb', line 68

def reset(attr = nil)
  if attr.nil?
    data.members.each do |attr| data[attr] = INHERITED end
    self
  elsif inherited?(attr)
    nil
  else
    old, data[attr] = data[attr], INHERITED
    old
  end
end