protect from circular references with inside-out storage for callbacks