A number of static methods that are implemented in the Uize base class, and that have (up until now) been inherited by all subclasses of Uize, are now no longer inheritable.
The concept of non-inheritable statics has been introduced, with a way provided to "register" static features of a class as being non-inheritable.
1. Why the Change?
The static features of the Uize base class that have been made non-inheritable have been made so in order to clean up the statics defined in all classes across the entire framework.
Previously, all classes were inheriting a ton of static methods (see Statics That Are No Longer Inheritable) that are really just utility functions that only need to exist directly in the Uize base class. More generally, there are times when there is no compelling reason for a static feature of a class to be inherited by its subclasses. Too many inherited static features can just clutter subclasses in the class hierarchy with cruft that they neither need nor care about. To address this concern, the inheritance system of the UIZE JavaScript Framework provides a way to "register" static features of a class as being non-inheritable.
2. How This Change Affects You
With this change, certain static methods of Uize that you may have come to rely on as static methods inherited by the Uize subclasses you write, are no longer inherited by your subclasses.
Therefore, these methods must now be called directly on the Uize base class and not on your subclasses. So, whereas previously you may have written something like...
BEFORE
_class.copyInto (myObject,myExtraProperties);
...now you will need to write this statement as...
AFTER
Uize.copyInto (myObject,myExtraProperties);
3. Statics That Are No Longer Inheritable
Static features of the Uize base class that are no longer inheritable by subclasses are as follows...
NO LONGER INHERITABLE STATICS
_class.callOn >> BECOMES >> Uize.callOn _class.capFirstChar >> BECOMES >> Uize.capFirstChar _class.clone >> BECOMES >> Uize.clone _class.constrain >> BECOMES >> Uize.constrain _class.copyInto >> BECOMES >> Uize.copyInto _class.escapeRegExpLiteral >> BECOMES >> Uize.escapeRegExpLiteral _class.findRecord >> BECOMES >> Uize.findRecord _class.findRecordNo >> BECOMES >> Uize.findRecordNo _class.getGuid >> BECOMES >> Uize.getGuid _class.getModuleByName >> BECOMES >> Uize.getModuleByName _class.getPathToLibrary >> BECOMES >> Uize.getPathToLibrary _class.globalEval >> BECOMES >> Uize.globalEval _class.indexIn >> BECOMES >> Uize.indexIn _class.isArray >> BECOMES >> Uize.isArray _class.isFunction >> BECOMES >> Uize.isFunction _class.isIn >> BECOMES >> Uize.isIn _class.isInstance >> BECOMES >> Uize.isInstance _class.isNumber >> BECOMES >> Uize.isNumber _class.module >> BECOMES >> Uize.module _class.moduleLoader >> BECOMES >> Uize.moduleLoader _class.moduleUrlResolver >> BECOMES >> Uize.moduleUrlResolver _class.moduleUrlTemplate >> BECOMES >> Uize.moduleUrlTemplate _class.pairUp >> BECOMES >> Uize.pairUp _class.pathToResources >> BECOMES >> Uize.pathToResources _class.recordMatches >> BECOMES >> Uize.recordMatches _class.substituteInto >> BECOMES >> Uize.substituteInto
Of the static methods that have become non-inheritable, the following methods are more likely to have been used in code (given their utility value) and are more likely to need changing in your code: Uize.capFirstChar, Uize.clone, Uize.constrain, Uize.copyInto, Uize.findRecord, Uize.findRecordNo, Uize.indexIn, Uize.isArray, Uize.isFunction, Uize.isIn, Uize.isNumber, Uize.pairUp.
4. Updated UIZE Modules
A good number of modules in the UIZE JavaScript Framework had to be updated as a result of the previously inheritable static methods becoming non-inheritable.
The modules that were updated include: Uize, Uize.Comm, Uize.Comm.Iframe, Uize.Comm.Iframe.Upload, Uize.Comm.Script, Uize.Fade, Uize.Fade.xFactory, Uize.Fade.xSeries, Uize.Widget, Uize.Widget.Bar, Uize.Widget.Button, Uize.Widget.Button.Toggle, Uize.Widget.Collection.Dynamic, Uize.Widget.Collection, Uize.Widget.CollectionItem.Zooming, Uize.Widget.ColorPicker, Uize.Widget.Committer, Uize.Widget.Dialog.Confirm, Uize.Widget.Dialog, Uize.Widget.Drag, Uize.Widget.EdgeHugger, Uize.Widget.Form, Uize.Widget.FormElement, Uize.Widget.FormElements, Uize.Widget.FormWarnings, Uize.Widget.HoverFader, Uize.Widget.ImagePort.Draggable, Uize.Widget.ImageWipe, Uize.Widget.MagView, Uize.Widget.Options.Accordion, Uize.Widget.Options, Uize.Widget.Options.Tabbed, Uize.Widget.Page, Uize.Widget.Page.xDeferredLinks, Uize.Widget.Picker, Uize.Widget.Picker.Selector, Uize.Widget.Population, Uize.Widget.Resizer, Uize.Widget.Scrolly, Uize.Widget.SlideShow, Uize.Widget.Swap.Image.Cycle, Uize.Widget.Swap, Uize.Widget.Tree.
5. Registering Non-inheritable Statics
With the introduction of the new MyClass.nonInheritableStatics static property, static features of any class you create can now be "registered" as non-inheritable.
The MyClass.nonInheritableStatics static property is a lookup object, automatically created for a class, in which you can register the static features (methods or properties) of the class that should not be inherited when that class is subclassed. Each property of the Uize.nonInheritableStatics lookup object represents a single static feature of the class that should not be inherited by subclasses, where the name of each property should be the name of a static feature (excluding the module name), and the value of each property should be a truthy value (such as true, 1, 'foo', [], {}, etc.). After a class has been created, non-inheritable statics can be registered for that class by assigning properties to the class' MyClass.nonInheritableStatics static property, as shown in the example below...
EXAMPLE
MyClass = Uize.subclass ();
MyClass.someUtilityFunction = function () {
// do something of great utility
};
MyClass.nonInheritableStatics.someUtilityFunction = 1;
MyClassSubclass = MyClass.subclass ();
alert (MyClassSubclass.someUtilityFunction); // alerts the text "undefined"
In the above example, the MyClass.someUtilityFunction static method of the class MyClass has been registered as a non-inheritable static. This is done by the statement MyClass.nonInheritableStatics.someUtilityFunction = 1. Now, when the MyClassSubclass class is created by calling the MyClass.subclass method, the new subclass that is created does not get the someUtilityFunction static feature. Therefore, the alert statement displays the text "undefined" in the alert dialog.
For a more in-depth discussion of non-inheritable statics, consult the Non-inheritable Statics section of the JavaScript Inheritance explainer, along with the reference documentation for the Uize.nonInheritableStatics static property in the reference for the Uize module.