refractor FTPHub to AbstractFTPHub