abstracted player as a plugin