I feel like it would be conceptually cleaner to just have an InnerBeamSqlEnv object owned by the BeamSqlEnv that all register calls would get immediately passed down to. There could then be a getImpl() method clearly marked as being a non-public API that could return the InnerBeamSqlEnv object used in the implementation. I worry that, as currently written, it's possible for the BeamSqlEnv and any InnerBeamSqlEnv created from it to diverge, and that may be non-obvious. What do you think?