code: public RemoteMenuController build() throws IOException {
          if(protocol == null) {
              protocol = new TagValMenuCommandProtocol();
          }
          if(executorService == null) {
              executorService = Executors.newScheduledThreadPool(2,
                      new NamedDaemonThreadFactory("remote-socket"));
          }
          SocketBasedConnector connector = new SocketBasedConnector(executorService, protocol, address, port);
          return new RemoteMenuController(connector, menuTree, executorService, name, clock);
      }
docs: Once the above methods have been called to fill in the blanks, then call build to get
  the actual instance.
  @return the actual instance.