added run_with_callback method for a more consistent usage pattern with say steps