use instance_eval to make this a proper DSL