use decorator pattern /w abstract base