added decorator pattern