code: public <RESULT> RESULT query(Query<ROOT, RESULT> query) {
          return query.evaluate(getImmutable());
      }
docs: Query system (immutable view of it).
  <p>
  Few things to remember: 1. if operations done on system (using query) do
  make some changes they will not be preserved (for long) 2. it is possible
  to return any object from domain (including IMMUTABLE root) and perform
  operations later on (but the more You do inside Query the safer).
  
  @param <RESULT> result of query
  @param query    lambda (or query implementation) with operations
  @return calculated result