class Ivar::Manifest
Represents a manifest of instance variable declarations for a class/module
def add_explicit_declaration(declaration)
-
(ExplicitDeclaration)
- The added declaration
Parameters:
-
declaration
(ExplicitDeclaration
) -- The declaration to add
def add_explicit_declaration(declaration) name = declaration.name @declarations_by_name[name] = declaration declaration.on_declare(@owner) declaration end
def all_declarations
-
(Array
- All declarations)
def all_declarations ancestor_manifests .flat_map(&:declarations) .+(declarations) # use hash stores to preserve order and deduplicate by name .each_with_object({}) { |decl, acc| acc[decl.name] = decl } .values end
def ancestor_manifests
-
(Array
- Array of ancestor manifests)
def ancestor_manifests return [] unless @owner.respond_to?(:ancestors) @owner .ancestors.reject { |ancestor| ancestor == @owner } .filter_map { |ancestor| Ivar.get_manifest(ancestor, create: false) } .reverse end
def declarations
-
(Array
- The declarations in this manifest)
def declarations @declarations_by_name.values end
def declared?(name)
-
(Boolean)
- Whether the variable is declared
Parameters:
-
name
(Symbol, String
) -- The variable name
def declared?(name) name = name.to_sym # Check in this manifest first return true if @declarations_by_name.key?(name) # Then check in ancestor manifests ancestor_manifests.any? do |ancestor_manifest| ancestor_manifest.declarations_by_name.key?(name) end end
def explicit_declarations
-
(Array
- All explicit declarations)
def explicit_declarations declarations.select { |decl| decl.is_a?(ExplicitDeclaration) } end
def explicitly_declared_ivars
def explicitly_declared_ivars all_declarations.grep(ExplicitDeclaration).map(&:name) end
def get_declaration(name)
-
(Declaration, nil)
- The declaration, or nil if not found
Parameters:
-
name
(Symbol, String
) -- The variable name
def get_declaration(name) name = name.to_sym # Check in this manifest first return @declarations_by_name[name] if @declarations_by_name.key?(name) # Then check in ancestor manifests, starting from the closest ancestor ancestor_manifests.each do |ancestor_manifest| if ancestor_manifest.declarations_by_name.key?(name) return ancestor_manifest.declarations_by_name[name] end end nil end
def initialize(owner)
-
owner
(Class, Module
) -- The class or module this manifest is associated with
def initialize(owner) @owner = owner @declarations_by_name = {} end
def process_before_init(instance, args, kwargs)
-
(Array, Hash)
- The modified args and kwargs
Parameters:
-
kwargs
(Hash
) -- Keyword arguments -
args
(Array
) -- Positional arguments -
instance
(Object
) -- The object being initialized
def process_before_init(instance, args, kwargs) # Get all declarations from parent to child, with child declarations taking precedence declarations_to_process = all_declarations # Process all initializations in a single pass # The before_init method will handle keyword arguments with proper precedence declarations_to_process.each do |declaration| declaration.before_init(instance, args, kwargs) end [args, kwargs] end