docs: public void watch(Watcher watcher) throws WatchException{
  		if(isClosed){
  			throw new WatchException("Watch Monitor is closed !");
  		}
  		registerPath();
  //		log.debug("Start watching path: [{}]", this.path);
  		
  		while (false == isClosed) {
  			WatchKey wk;
  			try {
  				wk = watchService.take();
  			} catch (InterruptedException e) {
  //				log.warn(e);
  				return;
  			}
  			
  			final Path currentPath = watchKeyPathMap.get(wk);
  			WatchEvent.Kind<?> kind;
  			for (WatchEvent<?> event : wk.pollEvents()) {
  				kind = event.kind();
  				if(null != this.filePath && false == this.filePath.endsWith(event.context().toString())){
  //					log.debug("[{}] is not fit for [{}], pass it.", event.context(), this.filePath.getFileName());
  					continue;
  				}
  				
  				if(kind == StandardWatchEventKinds.ENTRY_CREATE){
  					watcher.onCreate(event, currentPath);
  				}else if(kind == StandardWatchEventKinds.ENTRY_MODIFY){
  					watcher.onModify(event, currentPath);
  				}else if(kind == StandardWatchEventKinds.ENTRY_DELETE){
  					watcher.onDelete(event, currentPath);
  				}else if(kind == StandardWatchEventKinds.OVERFLOW){
  					watcher.onOverflow(event, currentPath);
  				}
  			}
  			wk.reset();
  		}
  	}