I use lots of functions, mostly passing the UID of an object as the only parameter. On the other side of the function I pick the object by UID. You keep the functions in event files separate from regular non function events, since all functions are global. Don't use any global variables (if you must have them keep them in a dictionary and access them by functions).
Put all your assets in a single layout you don't use for anything else, this way you know the initial state (or at least where to find what you want to be the initial state).
When in doubt, make a new sprite with a different name and give it the same images as the sprite it is going to behave like. This doesn't use any image memory since they all get merged. So if on one layout a sprite has drag and drop, make it a new sprite with ddrop_name.
I haven't used the new disabled click layers yet, but that will help keeping menu's above the layout from clicking through.
Be warry of the parent child code. You have to be careful what happens when you mix them with persist and the debugger doesn't help much with parent child stuff.
The debugger is great in some ways, but I have never set a useful break point, probably because I use so many functions.