move drag events into a mixin for clarity