supports callback hooks