I think the purpose of instance_eval is one of those "sharp knife" things in Ruby. (Some other languages try to protect by not giving you sharp knives. Ruby gives you sharp knives, and trusts that you know enough not to hurt yourself.) In Ruby, you can always use instance_eval to tweak the @instance variables for an object. Even if 'private' and 'protected' were enforced, this means that you can totally break the OOP encapsulation. 1) Any time you use #instance_eval, you should say to yourself "Damn, this is a very sharp knife. I'd better be sure not to cut myself!" Especially if you're messing wih the internals of a class you don't know fully how it works. 2) If you are writing a class or module for use by others, they will have access to the source code, and could rewrite it to allow things you didn't intend. Use 'protected' and 'private' to indicate when the methods should be called under normal circumstances. But it's not a guarantee.