Putting Power in the Hands of End Users: A Study of Programming by Demonstration, with an Application to Geographical Information Systems