extend functionality / break down into components