follow protocol structure of cljs more closely