class Ivar::Manifest

Represents a manifest of instance variable declarations for a class/module

def add_explicit_declaration(declaration)

Returns:
  • (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

Returns:
  • (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

Returns:
  • (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

Returns:
  • (Array) - The declarations in this manifest
def declarations
  @declarations_by_name.values
end

def declared?(name)

Returns:
  • (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

Returns:
  • (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)

Returns:
  • (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)

Parameters:
  • 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)

Returns:
  • (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