self-define class too big to maintain, TODO