broke out the parts into something more atomic to give customization points