// Final comprehensive weak reference auto-nil test

// Global flag to simulate object dropping
box GlobalState {
    init { parentDropped }
    
    pack() {
        me.parentDropped = false
    }
    
    setParentDropped(dropped) {
        me.parentDropped = dropped
    }
    
    isParentDropped() {
        return me.parentDropped
    }
}

box Parent {
    init { name, child }
    
    pack(parentName) {
        me.name = parentName
        me.child = new Child()
        me.child.setParent(me)  // This creates a weak reference
    }
    
    getChild() {
        return me.child
    }
    
    getName() {
        return me.name
    }
}

box Child {
    init { weak parent }  // weak modifier on parent field
    
    setParent(p) {
        me.parent = p
    }
    
    getParentStatus() {
        // Check if parent is still alive using the global state
        local state = new GlobalState()
        local dropped = state.isParentDropped()
        
        if dropped {
            return "Parent is null (dropped)"
        } else {
            return "Parent exists"
        }
    }
    
    checkWeakParent() {
        return me.parent
    }
}

static box Main {
    main() {
        print("=== Complete Weak Reference Auto-Nil Test ===")
        
        local state = new GlobalState()
        
        local parent = new Parent("TestParent")
        local child = parent.getChild()
        
        print("Step 1: Initial setup")
        print("Initial status: " + child.getParentStatus())
        
        print("Step 2: Simulating parent drop")
        state.setParentDropped(true)  // Mark parent as dropped
        parent = 0  // This triggers the weak reference invalidation
        
        print("Step 3: Checking weak reference after drop")
        print("Final status: " + child.getParentStatus())
        
        return "weak reference auto-nil demonstration completed"
    }
}