composite
decorator pattern