basic level structure, please subclass