#: Austin Ziegler changed the world a bit at a time by saying on  8/24/2005 10:31 PM :#
> [NOTE: This is an offshoot of Zed Shaw's rant on Chainsaw Infanticide.]
> 
>> It is probably worth having a public discussion on the meaning of
>> "extend cleanly".
> 
> Aye, so I'll start. If you're going to extend core or standard library
> classes, you should:
> 
> 1. Do so only at the user's request. Diff::LCS *can* extend String and
>    Array but does not do so by default. If you are going to extend by
>    default, then you must document it in a very loud tone of voice, as
>    it were.
> 
> 2. Don't depend on extensions to the core or standard library classes if
>    you're working on a *library* of code for others to use. Subclass,
>    extend (with a module), or delegate if you absolutely must. The
>    predecessor to Diff::LCS (Algorithm::Diff) added #map_with_index or
>    something similar to Array and depended on it. I don't think that
>    Diff::LCS does that.
> 
>    Applications and application frameworks may have exemptions. This
>    sort of allows for 1.day.ago notation as in Rails.
> 
> 3. If you absolutely must extend the core and depend on it in a library,
>    try to use names that don't interfere with others.
>    Transaction::Simple follows #1, but it also follows this.
> 
> -austin

I will add my outsider 2c opinions:

1/ extend only if you don't have any other means to do it (meaning you have tried: subclass, extend 
with module or delegate)

2/ if extending than use non-conflicting names and document them

3/ if you reopen an external class and redefine existing methods: document this and offer an alias

These apply imo to all core, standard and frameworks. Applications would be nice to behave the same 
but not mandatory. However keep in mind that one row of documentation may change a whole day for 
somebody else. Respect the others!

:alex |.::the_mindstorm::.|