@Override
 public void init() throws Throwable {
   client = new ZooClient(logger.getLogger(ZooClient.class), config);
   life.add(client);
   client.addZooListener(new ZooHaEventListener());
   client.addCompatibilityModeListener(new ZooCompatibilityModeListener());
   life.init();
 }
 @Override
 public void start() throws Throwable {
   life.start(); // Binds ZooClient so we have a local address to use next
   Listeners.notifyListeners(
       bindingListeners,
       new Listeners.Notification<BindingListener>() {
         @Override
         public void notify(BindingListener listener) {
           listener.listeningAt(URI.create(client.getClusterServer()));
         }
       });
   client.refreshMasterFromZooKeeper();
   Listeners.notifyListeners(
       haListeners,
       new Listeners.Notification<ClusterMemberListener>() {
         @Override
         public void notify(ClusterMemberListener listener) {
           listener.coordinatorIsElected(new InstanceId(client.getCachedMaster().getMachineId()));
         }
       });
   Listeners.notifyListeners(
       haListeners,
       new Listeners.Notification<ClusterMemberListener>() {
         @Override
         public void notify(ClusterMemberListener listener) {
           listener.memberIsAvailable(
               HighAvailabilityModeSwitcher.MASTER,
               new InstanceId(client.getCachedMaster().getMachineId()),
               URI.create("ha://" + client.getCachedMaster().getServerAsString()));
         }
       });
 }