@Override
    public void dataSnapshot(@NotNull DataSnapshotProvider provider) {
      Object prev = source;
      source = provider;
      try {
        provider.dataSnapshot(this);
      }
      finally {
        source = prev;
      }
    }
@Override
    public void dataSnapshot(@NotNull DataSnapshotProvider provider)