refactor to use setup.py