extract this class to make it easier to reuse without all the report view stuff