My point is exactly this - nothing is safe, nothing should be 'made' safe, and everything should be visible. It is far safer if everything is visible, than it is with "hidden" features. Private/Protected/Final are just obscurities.
I guess I see access control as slightly different. More of a language construct to help enforce best practices, rather than hinder client developers. When I make something private it's because I know it's only ever useful in a certain context, which is typically setup via a purblic call.
My distaste for restriction is not solely BDD/TDD, BDD/TDD simply highlights this issues which is what BDD/TDD are good for, and is what is their primary purpose.
I hear ya. If I can appreciate anything TDD it's the fact that it forces your code to remain simple and dependency free.
No, it's the very fact that you, as the creating developer, have decided something for me.
I think that is inherent in all levels of software. I make executive decisions constantly, whether it be an interface, database design, implementation, etc. When I know a method called out of context will result in failure or weird results, that is generallyan indication for me to keep it private.
You have decided I should not have access to that member, you have decided I should not see it. If you use final, you have also decided I should not override, nor extend the behaviour. It is almost patronising. If the behaviour is there, I trust that it is warranted. If it is 'dangerous' then why the hell is it there in the first place?
Not nessecarily dangerous...but possibly pointless in the public context so why make it available?
Also on your last point, an interface is non-restrictive. So you've designed an interface, you may have even documented it already. Why are you not allowed to add more methods/members?
An interface (or rather an object) IMHO is best implemented following OCP. Certainly you should be able to add methods to a class, through extension, not from core hacking. If I have made a method private, it's likely because it's a helper method to simplify a public method(s) and reduce duplication (or eliminate it outright). It's not intended to be called in it's own context.
There has never been a time when I've thought "whew, thank god that was private/final/whatever" but countless times I've moaned "oh for God's sake, why is that private/final/whatever?"
Obviously it was open source? Why not change it as required? Although I can see that being a serious PITA and easily avoided if the developer only used private/protected as the exception rather than the rule. Like most programming constructs, etc...if it's abused it becomes counter-productive.
Cheers,
Alex