module Net::IMAP::Config::AttrInheritance
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:
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
Attributes
The parent Config object
Public Instance Methods
Source
# File lib/net/imap/config/attr_inheritance.rb, line 71 def inherited?(*attrs) attrs = data.members if attrs.empty? attrs.all? { data[_1] == INHERITED } end
Returns true if attr is inherited from parent and not overridden by this config.
When multiple attrs are given, returns true if all of them are inherited, or false if any of them are overriden. When no attrs are given, returns true if all attributes are inherited, or false if any attribute is overriden.
Related: overrides?
Source
# File lib/net/imap/config/attr_inheritance.rb, line 92 def inherits_defaults?(*attrs) if equal?(Config.default) true elsif equal?(Config.global) true if inherited?(*attrs) elsif (v = AttrVersionDefaults::VERSIONS.find { equal? Config[_1] }) attrs = DEFAULT_TO_INHERIT if attrs.empty? attrs &= DEFAULT_TO_INHERIT (attrs.empty? || parent.inherits_defaults?(*attrs)) && v else inherited?(*attrs) && parent.inherits_defaults?(*attrs) end end
Returns whether all attrs are inherited from a default config. When no attrs are given, returns whether all attributes are inherited from a default config.
Returns true when all attributes inherit from Config.default, the version number (as a Rational) when all attributes inherit from a versioned default (see Versioned defaults at Config), nil if any attributes inherit from Config.global overrides (but not from non-global ancestors), or false when any attributes have been overridden by self or an ancestor (besides global or default configs),
Related: overrides?
Source
# File lib/net/imap/config/attr_inheritance.rb, line 55 def new(**attrs) self.class.new(self, **attrs) end
Creates a new config, which inherits from self.
Source
# File lib/net/imap/config/attr_inheritance.rb, line 119 def overrides?(*attrs) attrs = data.members if attrs.empty? attrs.any? { data[_1] != INHERITED } end
Returns true if attr is defined on this config and not inherited from parent.
When multiple attrs are given, returns true if any of them are defined on self. When no attrs are given, returns true if any attribute is overriden.
Related: inherited?
Source
# File lib/net/imap/config/attr_inheritance.rb, line 131 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
Resets an attr to inherit from the parent config.
When attr is nil or not given, all attributes are reset.
Protected Instance Methods
Source
# File lib/net/imap/config/attr_inheritance.rb, line 48 def initialize(parent = nil) # :notnew: super() @parent = Config[parent] reset end