Glenn Linderman wrote:
On approximately 5/16/2006 12:31 PM, came the following characters from the keyboard of Robert May:
As you all know I feel that backwards compatibility is important, and have been striving not break existing scripts when making changes. However, going forwards some things will have to change, and I thought it would be worthwhile for me to outline my strategy for deprecating and then removing/changing functionality. I would appreciate comments on the following:

(1) When making a change backwards compatibility will be maintained wherever possible. When a change in behaviour is desirable (for example 'use Win32::GUI;' not exporting 360+ Constants) then a release (in this case 1.04) will issue a 'deprecated' warning stating that behaviour will change in the future, and explaining what changes should be made.

Care should be taken that the message (or the documentation for the message) points the user to how to eliminate the warning, how to fix the behaviour warned about, so that it works warning-free with the current code, and will not encounter known future warnings or errors when the feature is removed.

I think this is basically what you are saying.

That was what I intended.

(2) A subsequent release (depending on the gaps in the release cycle and the severity of the change this might be the following release - in this example 1.05) may change behaviour, but will issue a warning that the behaviour has changed (may die instead depending on the change).

If old syntax can be retired, that paves the way for being able to die or perpetuate an error message. It may not always be the case that the old syntax should be retired. "use Win32::GUI;" seems like syntax that should be made to work without warning even once the constants are removed.

If it is possible to issue the warning, or remind about the removed feature, at the time of attempted use of the removed feature (constants) that would be nice, but I haven't spent time to figure out if that is possible in this case.

I'll give an example of what I expect for the constants stuff. I certainly don't intend to remove 'use Win32::GUI;', but it's behaviour will change, and it won't export any constants.

Currently
  use Win32::GUI;
exports over 300 arbitrary constants into the callers name space. IMHO this construct should either export all constants, or none. Now that all constants is more than 6500, I can't see how this should be all.

My plan:

Win32::GUI v1.04 will issue the following warning for 'use Win32::GUI;', whilst still exporting the same 300+ constants: "'use Win32::GUI;' is currently exporting constants into the callers scope. This functionality is deprecated. Use 'use Win32::GUI();' or list your required exports explicitly instead. Used at FILENAME line LINENUMBER."

Win32::GUI v1.05 will stop exporting the 300+ constants, and will warn that that is what it has done. Something like: "'use Win32::GUI;' behaviour has changed since v1.04: better written as 'use Win32::GUI();'. Used at FILENAME line LINENUMBER."

Win32::GUI v1.06 will stop issuing the warning, whilst maintaining the v1.05 behaviour.


Compare this with use of Win32::GUI::constant("ES_WANTRETURN");

In 1.04, a warning issued, but old functionality remains:
"Use of Win32::GUI::constant() is deprecated. Use Win32::GUI::Constants::constant() instead. Used at FILENAME line LINENUMBER."

In 1.05, it will die with a message:
"Use of Win32::GUI::constant() has been removed. Use Win32::GUI::Constants::constant() instead. Used at FILENAME line LINENUMBER."

In 1.06 the function will not exist.


And finally with the if($a = Win32::GUI::ESWANTRETURN) usage:

In 1.04, a warning:
Use of 'Win32::GUI::ES_WANTRETURN' is deprecated. Use 'Win32::GUI::Constants::ES_WANTRETURN' instead. Used at FILENMAE line LINENUMBER."

In 1.05, death:
Use of 'Win32::GUI::ES_WANTRETURN' has been removed. Use 'Win32::GUI::Constants::ES_WANTRETURN' instead. Used at FILENMAE line LINENUMBER."

In 1.06 you'll probably get a warning from perl about an undefined subroutine.


Of course, spotting any of this in the 1.04 release depends on the use script running with warnings on - without that the first thing you'll notice is your script failing/dying under 1.05 ....

Does this work?

Rob.

Reply via email to