App-I18N
view release on metacpan or search on metacpan
share/static/DUI.js view on Meta::CPAN
var levels = ns.split(".");
/* Dynamic classes are Functions, so we'll extend their prototype.
Static classes are Objects, so we'll extend them directly */
var nsobj = this.prototype ? this.prototype : this;
$.each(levels, function() {
/* When adding a namespace check to see, in order:
* 1) Does the ns exist in our ns passthrough object?
* 2) Does the ns already exist in our class
* 3) Does the ns exist as a global var?
* NOTE: Support for this was added so that you can namespace classes
* into other classes, i.e. MyContainer.namespace('MyUtilClass'). this
* behaviour is dangerously greedy though, so it may be removed.
* 4) If none of the above, make a new static class
*/
nsobj[this] = _this.ns[this] || nsobj[this] || window[this] || DUI.Class.create(true);
/* If our parent and child are both dynamic classes, copy the child out of Parent.prototype and into Parent.
* It seems weird at first, but this allows you to instantiate a dynamic sub-class without instantiating
* its parent, e.g. var baz = new Foo.Bar();
*/
if(_this.prototype && DUI.isClass(nsobj[this]) && nsobj[this].prototype) {
_this[this] = nsobj[this];
}
//Remove our temp passthrough if it exists
delete _this.ns[this];
//Move one level deeper for the next iteration
nsobj = nsobj[this];
});
//TODO: Do we really need to return this? It's not that useful anymore
return nsobj;
},
/* Create exists inside classes too. neat huh?
* Usage differs slightly: MyClass.create('MySubClass', { myMethod: function() }); */
create: function() {
//Turn arguments into a regular Array
var args = Array.prototype.slice.call(arguments);
//Pull the name of the new class out
var name = args.shift();
//Create a new class with the rest of the arguments
var temp = DUI.Class.create.apply(DUI.Class, args);
//Load our new class into the {name: class} format to pass it into namespace()
var ns = {};
ns[name] = temp;
//Put the new class into the current one
this.namespace(ns);
},
//Iterate over a class' members, omitting built-ins
each: function(cb) {
if(!$.isFunction(cb)) {
throw new Error('DUI.Class.each must be called with a function as its first argument.');
}
//Set _this to the current class, not the DUI.Class lib itself
var _this = this;
$.each(this, function(key) {
if(_this._dontEnum.indexOf(key) != -1) return;
cb.apply(this, [key, this]);
});
},
//Call the super of a method
sup: function() {
try {
var caller = this.sup.caller.name;
this.supers[caller].apply(this, arguments);
} catch(noSuper) {
return false;
}
}
}
//Static classes don't need a constructor
s ? delete methods.init : null;
//...nor should they be identified as dynamic classes
s ? methods._ident.dynamic = false : null;
/* Put default methods into the class before anything else,
* so that they'll be overwritten by the user-specified ones */
$.extend(c, methods);
/* Second copy of methods for dynamic classes: They get our
* common utils in their class definition AND their prototype */
if(!s) $.extend(c.prototype, methods);
//Static: extend the Object, Dynamic: extend the prototype
var extendee = s ? c : c.prototype;
//Loop through arguments. If they're the right type, tack them on
$.each(arguments, function() {
//Either we're passing in an object full of methods, or the prototype of an existing class
if(this.constructor == Object || typeof this.init != undefined) {
/* Here we're going per-property instead of doing $.extend(extendee, this) so that
* we overwrite each property instead of the whole namespace. Also: we omit the 'namespace'
* helper method that DUI.Class tacks on, as there's no point in storing it as a super */
for(i in this) {
/* If a property is a function (other than our built-in helpers) and it already exists
* in the class, save it as a super. note that this only saves the last occurrence */
if($.isFunction(extendee[i]) && _this._dontEnum.indexOf(i) == -1) {
//since Function.name is almost never set for us, do it manually
this[i].name = extendee[i].name = i;
//throw the existing function into this.supers before it's overwritten
extendee.supers[i] = extendee[i];
}
//Special case! If 'dontEnum' is passed in as an array, add its contents to DUI.Class._dontEnum
if(i == 'dontEnum' && this[i].constructor == Array) {
extendee._dontEnum = $.merge(extendee._dontEnum, this[i]);
}
//extend the current property into our class
extendee[i] = this[i];
}
}
});
//Shiny new class, ready to go
return c;
}
};
/* Turn DUI into a static class whose contents are DUI.
Now you can use DUI's tools on DUI itself, i.e. DUI.create('Foo');
I'm pretty sure this won't melt the known universe, but caveat emptor. */
DUI = DUI.Class.create(DUI, true);
})(jQuery);
//Simple check so see if the object passed in is a DUI Class
DUI.isClass = function(check, type)
{
type = type || false;
try {
if(check._ident.library == 'DUI.Class') {
if((type == 'dynamic' && !check._ident.dynamic)
|| (type == 'static' && check._ident.dynamic)) {
return false;
}
return true;
}
} catch(noIdentUhOh) {
return false;
}
return false;
}
( run in 1.165 second using v1.01-cache-2.11-cpan-f56aa216473 )