abstract code + barebones