code: @Override
    public WatchableTask<ZKData> getData(String path) {
      return new WatchableTask<ZKData>("zkGetData: " + path) {
        @Override
        protected Promise<? extends ZKData> run(Context context)
            throws Throwable {
          SettablePromise<ZKData> promise = Promises.settable();
  
          _zkClient.getData(path, _watcher,
              (int rc, String p, Object ctx, byte[] data, Stat stat) -> {
                KeeperException.Code code = KeeperException.Code.get(rc);
                switch (code) {
                  case OK:
                    _zkClient.getACL(path, stat,
                        (int rc1, String p1, Object ctx1, List<ACL> acls, Stat stat1) -> {
                          KeeperException.Code code1 = KeeperException.Code.get(rc1);
                          switch (code1) {
                            case OK:
                              promise.done(new ZKData(p, data, stat, acls));
                              break;
                            default:
                              promise.fail(KeeperException.create(code1, p1));
                          }
                        }, null);
                    break;
                  default:
                    promise.fail(KeeperException.create(code, p));
                }
              }, null);
          return promise;
        }
      };
    }
docs: {@inheritDoc}