Robert,
This is an interesting question.
I always provide all of my source code to my clients whether they wrote it into the contract or not. My feeling is that if I provide service that they find of value they will continue to work with me and if they don't then I don't really want to work with them.
The only time this would give me a problem is if I am incompetintent and if I am then, well, eventually it will catch up with me regardless of what I provide or don't provide.
To keep working I have to learn, every day. I have to keep up with the current trends in my chosen profession. I must read the literature and keep abreast of the latest technology advances. I must be two steps ahead of my clients, so when they ask I can imediately provide. I don't expect my clients to pay me for this, this is what I must do to keep working in my profession, just like a doctor must read his journals and attend conferences, so must I.
I must be unsatisfied with simply getting it done and require that I know what I did, why I did it, and what effects my actions have on other things. I must understand what is going on in my code and not be happy with copying what someone told me to do. I must read, read, read, read, read, and then when I'm done I must read some more. I must read things I need right now and read things I will need next week and next year.
I must solve my problems by my learning new information and applying that information and not be satisfied to get something fixed by using some code someone else gave me. When I ask for assistance and it is provided and it works, I must go the next step and study the answer and come to understand why it works and not just that it does.
If I didn't do these things then I would not be surprised that my clients were always one time jobs with no second call backs.