use stuart sierra's component model