We've actually used this strategy in the 4.5 revisions to the cluster library, so time will tell whether people find this objectionable. Another way to pass the data would be to add an orig.data argument to the various methods, so that the user could explicitely pass the original data used in fitting the model to the various methods. If this was omitted then the reference could be used. I think this would be my favorite approach. If one is going to pass the name of the data, I think the current scoping rules are perfectly reasonable.
S looks for a local variable, then for a global variable, then for a built-in object.
It is currently possible to use the strategy of looking in all parent frames. If the data is there the call will be ignored. If that is present then the call will be ignored. I guess I see the value of just getting the data name from the call in order to save space. The problem is that this doesn't support finding the data properly when the model object is used later within a function.