Module: Net::IMAP::Config::AttrInheritance
Relationships & Source Files | |
Namespace Children | |
Modules:
| |
Extension / Inclusion / Inheritance Descendants | |
Included In:
| |
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 Net::IMAP.config keyword, for example to use the appropriate defaults for an application or a library while still relying on global for configuration of Net::IMAP.debug or logger
, most likely the ancestor chain is still only four deep:
IMAP#config → alternate defaults → Config.global → Config.default
Constant Summary
-
INHERITED =
private
# File 'lib/net/imap/config/attr_inheritance.rb', line 26Module.new.freeze
Class Method Summary
- .included(mod) private
-
.attr_accessor(name)
Internal use only
internal API.
Instance Attribute Summary
-
#parent
readonly
The parent
::Net::IMAP::Config
object.
Instance Method Summary
-
#inherited?(attr) ⇒ Boolean
Returns
true
ifattr
is inherited from #parent and not overridden by this config. -
#initialize(parent = nil)
:notnew:
-
#new(**attrs)
Creates a new config, which inherits from
self
. -
#reset ⇒ self
Resets an
attr
to inherit from the #parent config. - #initialize_copy(other) private
Class Method Details
.attr_accessor(name)
internal API
# 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
.included(mod) (private)
[ GitHub ]# File 'lib/net/imap/config/attr_inheritance.rb', line 34
def self.included(mod) mod.extend Macros end
Instance Attribute Details
#parent (readonly)
The parent ::Net::IMAP::Config
object
# File 'lib/net/imap/config/attr_inheritance.rb', line 46
attr_reader :parent
Instance Method Details
#inherited?(attr) ⇒ Boolean
Returns true
if attr
is inherited from #parent and not overridden by this config.
# File 'lib/net/imap/config/attr_inheritance.rb', line 59
def inherited?(attr) data[attr] == INHERITED end
#initialize(parent = nil)
:notnew:
# File 'lib/net/imap/config/attr_inheritance.rb', line 48
def initialize(parent = nil) # :notnew: super() @parent = Config[parent] reset end
#initialize_copy(other) (private)
[ GitHub ]# File 'lib/net/imap/config/attr_inheritance.rb', line 82
def initialize_copy(other) super @parent ||= other # only default has nil parent end
#new(**attrs)
Creates a new config, which inherits from self
.
# File 'lib/net/imap/config/attr_inheritance.rb', line 55
def new(**attrs) self.class.new(self, **attrs) end
#reset ⇒ self
#reset(attr) ⇒ attribute
value
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.
# 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