makes it framework-agnostic