2b449ca06646ebb6603e35918a40bca8e0f43c8eSatyen Desai /**
64953b0596d07dbee9a9b521ed61c434ce4709b5Satyen Desai * The base-build submodule provides Base.build functionality, which
64953b0596d07dbee9a9b521ed61c434ce4709b5Satyen Desai * can be used to create custom classes, by aggregating extensions onto
64953b0596d07dbee9a9b521ed61c434ce4709b5Satyen Desai * a main class.
2b449ca06646ebb6603e35918a40bca8e0f43c8eSatyen Desai *
2b449ca06646ebb6603e35918a40bca8e0f43c8eSatyen Desai * @module base
64953b0596d07dbee9a9b521ed61c434ce4709b5Satyen Desai * @submodule base-build
e0008d92cea7515616980ad13e1075346a3bca2eSatyen Desai * @for Base
2b449ca06646ebb6603e35918a40bca8e0f43c8eSatyen Desai */
2b449ca06646ebb6603e35918a40bca8e0f43c8eSatyen Desai var Base = Y.Base,
fd76c7686fc15c4633e2199dbbfd992864f245d8Satyen Desai L = Y.Lang,
0709cd166604645c5511b892413b44ad6bce6b64Satyen Desai INITIALIZER = "initializer",
0709cd166604645c5511b892413b44ad6bce6b64Satyen Desai DESTRUCTOR = "destructor",
b66fb0b516da11d7d0a3e6151dab92af15eac49cSatyen Desai build,
b66fb0b516da11d7d0a3e6151dab92af15eac49cSatyen Desai arrayAggregator = function (prop, r, s) {
b66fb0b516da11d7d0a3e6151dab92af15eac49cSatyen Desai if (s[prop]) {
b66fb0b516da11d7d0a3e6151dab92af15eac49cSatyen Desai r[prop] = (r[prop] || []).concat(s[prop]);
b66fb0b516da11d7d0a3e6151dab92af15eac49cSatyen Desai }
b66fb0b516da11d7d0a3e6151dab92af15eac49cSatyen Desai };
fd76c7686fc15c4633e2199dbbfd992864f245d8Satyen Desai
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai Base._build = function(name, main, extensions, px, sx, cfg) {
fd76c7686fc15c4633e2199dbbfd992864f245d8Satyen Desai
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai var build = Base._build,
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai builtClass = build._ctor(main, cfg),
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai buildCfg = build._cfg(main, cfg, extensions),
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai _mixCust = build._mixCust,
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai dynamic = builtClass._yuibuild.dynamic,
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai
50ebe4de3ac641ae0af0b39a29ccf82e4c3760b6Satyen Desai i, l, extClass, extProto,
0709cd166604645c5511b892413b44ad6bce6b64Satyen Desai initializer,
0709cd166604645c5511b892413b44ad6bce6b64Satyen Desai destructor;
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai // Augment/Aggregate
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai for (i = 0, l = extensions.length; i < l; i++) {
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai extClass = extensions[i];
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai
0709cd166604645c5511b892413b44ad6bce6b64Satyen Desai extProto = extClass.prototype;
0709cd166604645c5511b892413b44ad6bce6b64Satyen Desai
0709cd166604645c5511b892413b44ad6bce6b64Satyen Desai initializer = extProto[INITIALIZER];
0709cd166604645c5511b892413b44ad6bce6b64Satyen Desai destructor = extProto[DESTRUCTOR];
0709cd166604645c5511b892413b44ad6bce6b64Satyen Desai delete extProto[INITIALIZER];
0709cd166604645c5511b892413b44ad6bce6b64Satyen Desai delete extProto[DESTRUCTOR];
0709cd166604645c5511b892413b44ad6bce6b64Satyen Desai
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai // Prototype, old non-displacing augment
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai Y.mix(builtClass, extClass, true, null, 1);
0709cd166604645c5511b892413b44ad6bce6b64Satyen Desai
9f74fe13660a0d9d411c97798c85863de1745bbfSatyen Desai // Custom Statics
9f74fe13660a0d9d411c97798c85863de1745bbfSatyen Desai _mixCust(builtClass, extClass, buildCfg);
9f74fe13660a0d9d411c97798c85863de1745bbfSatyen Desai
0709cd166604645c5511b892413b44ad6bce6b64Satyen Desai if (initializer) {
0709cd166604645c5511b892413b44ad6bce6b64Satyen Desai extProto[INITIALIZER] = initializer;
0709cd166604645c5511b892413b44ad6bce6b64Satyen Desai }
0709cd166604645c5511b892413b44ad6bce6b64Satyen Desai
0709cd166604645c5511b892413b44ad6bce6b64Satyen Desai if (destructor) {
0709cd166604645c5511b892413b44ad6bce6b64Satyen Desai extProto[DESTRUCTOR] = destructor;
0709cd166604645c5511b892413b44ad6bce6b64Satyen Desai }
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai builtClass._yuibuild.exts.push(extClass);
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai }
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai if (px) {
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai Y.mix(builtClass.prototype, px, true);
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai }
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai if (sx) {
9f74fe13660a0d9d411c97798c85863de1745bbfSatyen Desai Y.mix(builtClass, build._clean(sx, buildCfg), true);
9f74fe13660a0d9d411c97798c85863de1745bbfSatyen Desai _mixCust(builtClass, sx, buildCfg);
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai }
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai builtClass.prototype.hasImpl = build._impl;
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai if (dynamic) {
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai builtClass.NAME = name;
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai builtClass.prototype.constructor = builtClass;
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai }
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai return builtClass;
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai };
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai build = Base._build;
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai Y.mix(build, {
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai _mixCust: function(r, s, cfg) {
9f74fe13660a0d9d411c97798c85863de1745bbfSatyen Desai
9f74fe13660a0d9d411c97798c85863de1745bbfSatyen Desai var aggregates,
9f74fe13660a0d9d411c97798c85863de1745bbfSatyen Desai custom,
9f74fe13660a0d9d411c97798c85863de1745bbfSatyen Desai statics,
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai aggr,
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai l,
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai i;
9f74fe13660a0d9d411c97798c85863de1745bbfSatyen Desai
9f74fe13660a0d9d411c97798c85863de1745bbfSatyen Desai if (cfg) {
9f74fe13660a0d9d411c97798c85863de1745bbfSatyen Desai aggregates = cfg.aggregates;
9f74fe13660a0d9d411c97798c85863de1745bbfSatyen Desai custom = cfg.custom;
9f74fe13660a0d9d411c97798c85863de1745bbfSatyen Desai statics = cfg.statics;
9f74fe13660a0d9d411c97798c85863de1745bbfSatyen Desai }
9f74fe13660a0d9d411c97798c85863de1745bbfSatyen Desai
9f74fe13660a0d9d411c97798c85863de1745bbfSatyen Desai if (statics) {
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai Y.mix(r, s, true, statics);
9f74fe13660a0d9d411c97798c85863de1745bbfSatyen Desai }
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai if (aggregates) {
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai for (i = 0, l = aggregates.length; i < l; i++) {
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai aggr = aggregates[i];
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai if (!r.hasOwnProperty(aggr) && s.hasOwnProperty(aggr)) {
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai r[aggr] = L.isArray(s[aggr]) ? [] : {};
9f74fe13660a0d9d411c97798c85863de1745bbfSatyen Desai }
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai Y.aggregate(r, s, true, [aggr]);
9f74fe13660a0d9d411c97798c85863de1745bbfSatyen Desai }
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai }
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai if (custom) {
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai for (i in custom) {
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai if (custom.hasOwnProperty(i)) {
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai custom[i](i, r, s);
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai }
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai }
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai }
9f74fe13660a0d9d411c97798c85863de1745bbfSatyen Desai
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai },
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai _tmpl: function(main) {
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai function BuiltClass() {
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai BuiltClass.superclass.constructor.apply(this, arguments);
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai }
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai Y.extend(BuiltClass, main);
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai return BuiltClass;
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai },
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai _impl : function(extClass) {
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai var classes = this._getClasses(), i, l, cls, exts, ll, j;
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai for (i = 0, l = classes.length; i < l; i++) {
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai cls = classes[i];
c938b255ef3c02ee132e52fbd15bb211c6f3f760Satyen Desai if (cls._yuibuild) {
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai exts = cls._yuibuild.exts;
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai ll = exts.length;
c938b255ef3c02ee132e52fbd15bb211c6f3f760Satyen Desai
c938b255ef3c02ee132e52fbd15bb211c6f3f760Satyen Desai for (j = 0; j < ll; j++) {
c938b255ef3c02ee132e52fbd15bb211c6f3f760Satyen Desai if (exts[j] === extClass) {
c938b255ef3c02ee132e52fbd15bb211c6f3f760Satyen Desai return true;
c938b255ef3c02ee132e52fbd15bb211c6f3f760Satyen Desai }
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai }
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai }
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai }
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai return false;
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai },
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai _ctor : function(main, cfg) {
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai var dynamic = (cfg && false === cfg.dynamic) ? false : true,
a091e633a8a28a2f787150f3b87e4e4ec8e717baSatyen Desai builtClass = (dynamic) ? build._tmpl(main) : main,
a091e633a8a28a2f787150f3b87e4e4ec8e717baSatyen Desai buildCfg = builtClass._yuibuild;
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai
a091e633a8a28a2f787150f3b87e4e4ec8e717baSatyen Desai if (!buildCfg) {
a091e633a8a28a2f787150f3b87e4e4ec8e717baSatyen Desai buildCfg = builtClass._yuibuild = {};
a091e633a8a28a2f787150f3b87e4e4ec8e717baSatyen Desai }
a091e633a8a28a2f787150f3b87e4e4ec8e717baSatyen Desai
a091e633a8a28a2f787150f3b87e4e4ec8e717baSatyen Desai buildCfg.id = buildCfg.id || null;
a091e633a8a28a2f787150f3b87e4e4ec8e717baSatyen Desai buildCfg.exts = buildCfg.exts || [];
a091e633a8a28a2f787150f3b87e4e4ec8e717baSatyen Desai buildCfg.dynamic = dynamic;
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai return builtClass;
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai },
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai _cfg : function(main, cfg, exts) {
fd76c7686fc15c4633e2199dbbfd992864f245d8Satyen Desai var aggr = [],
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai cust = {},
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai statics = [],
fd76c7686fc15c4633e2199dbbfd992864f245d8Satyen Desai buildCfg,
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai cfgAggr = (cfg && cfg.aggregates),
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai cfgCustBuild = (cfg && cfg.custom),
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai cfgStatics = (cfg && cfg.statics),
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai c = main,
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai i,
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai l;
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai // Prototype Chain
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai while (c && c.prototype) {
9f74fe13660a0d9d411c97798c85863de1745bbfSatyen Desai buildCfg = c._buildCfg;
fd76c7686fc15c4633e2199dbbfd992864f245d8Satyen Desai if (buildCfg) {
fd76c7686fc15c4633e2199dbbfd992864f245d8Satyen Desai if (buildCfg.aggregates) {
fd76c7686fc15c4633e2199dbbfd992864f245d8Satyen Desai aggr = aggr.concat(buildCfg.aggregates);
fd76c7686fc15c4633e2199dbbfd992864f245d8Satyen Desai }
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai if (buildCfg.custom) {
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai Y.mix(cust, buildCfg.custom, true);
fd76c7686fc15c4633e2199dbbfd992864f245d8Satyen Desai }
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai if (buildCfg.statics) {
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai statics = statics.concat(buildCfg.statics);
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai }
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai }
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai c = c.superclass ? c.superclass.constructor : null;
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai }
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai // Exts
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai if (exts) {
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai for (i = 0, l = exts.length; i < l; i++) {
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai c = exts[i];
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai buildCfg = c._buildCfg;
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai if (buildCfg) {
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai if (buildCfg.aggregates) {
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai aggr = aggr.concat(buildCfg.aggregates);
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai }
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai if (buildCfg.custom) {
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai Y.mix(cust, buildCfg.custom, true);
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai }
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai if (buildCfg.statics) {
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai statics = statics.concat(buildCfg.statics);
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai }
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai }
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai }
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai }
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai if (cfgAggr) {
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai aggr = aggr.concat(cfgAggr);
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai }
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai
fd76c7686fc15c4633e2199dbbfd992864f245d8Satyen Desai if (cfgCustBuild) {
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai Y.mix(cust, cfg.cfgBuild, true);
fd76c7686fc15c4633e2199dbbfd992864f245d8Satyen Desai }
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai if (cfgStatics) {
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai statics = statics.concat(cfgStatics);
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai }
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai
fd76c7686fc15c4633e2199dbbfd992864f245d8Satyen Desai return {
fd76c7686fc15c4633e2199dbbfd992864f245d8Satyen Desai aggregates: aggr,
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai custom: cust,
52e73635546b2ee315b3d99cc7145a73ebc5b30eSatyen Desai statics: statics
fd76c7686fc15c4633e2199dbbfd992864f245d8Satyen Desai };
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai },
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai
9f74fe13660a0d9d411c97798c85863de1745bbfSatyen Desai _clean : function(sx, cfg) {
9f74fe13660a0d9d411c97798c85863de1745bbfSatyen Desai var prop, i, l, sxclone = Y.merge(sx),
9f74fe13660a0d9d411c97798c85863de1745bbfSatyen Desai aggregates = cfg.aggregates,
9f74fe13660a0d9d411c97798c85863de1745bbfSatyen Desai custom = cfg.custom;
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai for (prop in custom) {
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai if (sxclone.hasOwnProperty(prop)) {
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai delete sxclone[prop];
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai }
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai }
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai for (i = 0, l = aggregates.length; i < l; i++) {
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai prop = aggregates[i];
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai if (sxclone.hasOwnProperty(prop)) {
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai delete sxclone[prop];
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai }
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai }
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai return sxclone;
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai }
1201815cf554ddd27ca4898d9623926cfe3c2ac9Satyen Desai });
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai /**
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * <p>
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * Builds a custom constructor function (class) from the
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * main function, and array of extension functions (classes)
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * provided. The NAME field for the constructor function is
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * defined by the first argument passed in.
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * </p>
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * <p>
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * The cfg object supports the following properties
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * </p>
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * <dl>
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * <dt>dynamic &#60;boolean&#62;</dt>
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * <dd>
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * <p>If true (default), a completely new class
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * is created which extends the main class, and acts as the
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * host on which the extension classes are augmented.</p>
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * <p>If false, the extensions classes are augmented directly to
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * the main class, modifying the main class' prototype.</p>
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * </dd>
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * <dt>aggregates &#60;String[]&#62;</dt>
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * <dd>An array of static property names, which will get aggregated
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * on to the built class, in addition to the default properties build
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * will always aggregate as defined by the main class' static _buildCfg
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * property.
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * </dd>
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * </dl>
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai *
10d8bafc5c24f3a4285cf6060a1935ba5cfc4b85Luke Smith * @method build
af716e785a91e92d5cfa85d40fdd10a30f94751fSatyen Desai * @deprecated Use the more convenient Base.create and Base.mix methods instead
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * @static
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * @param {Function} name The name of the new class. Used to defined the NAME property for the new class.
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * @param {Function} main The main class on which to base the built class
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * @param {Function[]} extensions The set of extension classes which will be
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * augmented/aggregated to the built class.
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * @param {Object} cfg Optional. Build configuration for the class (see description).
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * @return {Function} A custom class, created from the provided main and extension classes
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai */
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai Base.build = function(name, main, extensions, cfg) {
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai return build(name, main, extensions, null, null, cfg);
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai };
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai /**
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * Creates a new class (constructor function) which extends the base class passed in as the second argument,
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * and mixes in the array of extensions provided.
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai *
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * Prototype properties or methods can be added to the new class, using the px argument (similar to Y.extend).
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai *
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * Static properties or methods can be added to the new class, using the sx argument (similar to Y.extend).
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai *
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * **NOTE FOR COMPONENT DEVELOPERS**: Both the `base` class, and `extensions` can define static a `_buildCfg`
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * property, which acts as class creation meta-data, and drives how special static properties from the base
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * class, or extensions should be copied, aggregated or (custom) mixed into the newly created class.
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai *
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * The `_buildCfg` property is a hash with 3 supported properties: `statics`, `aggregates` and `custom`, e.g:
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai *
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * // If the Base/Main class is the thing introducing the property:
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai *
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * MyBaseClass._buildCfg = {
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai *
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * // Static properties/methods to copy (Alias) to the built class.
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * statics: ["CopyThisMethod", "CopyThisProperty"],
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai *
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * // Static props to aggregate onto the built class.
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * aggregates: ["AggregateThisProperty"],
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai *
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * // Static properties which need custom handling (e.g. deep merge etc.)
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * custom: {
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * "CustomProperty" : function(property, Receiver, Supplier) {
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * ...
35ab18cdc8398064c2c60b0ed6bbe181ae9d05efSatyen Desai * var triggers = Receiver.CustomProperty.triggers;
35ab18cdc8398064c2c60b0ed6bbe181ae9d05efSatyen Desai Receiver.CustomProperty.triggers = triggers.concat(Supplier.CustomProperty.triggers);
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * ...
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * }
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * }
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * };
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai *
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * MyBaseClass.CopyThisMethod = function() {...};
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * MyBaseClass.CopyThisProperty = "foo";
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * MyBaseClass.AggregateThisProperty = {...};
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * MyBaseClass.CustomProperty = {
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * triggers: [...]
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * }
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai *
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * // Or, if the Extension is the thing introducing the property:
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai *
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * MyExtension._buildCfg = {
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * statics : ...
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * aggregates : ...
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * custom : ...
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * }
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai *
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * This way, when users pass your base or extension class to `Y.Base.create` or `Y.Base.mix`, they don't need to
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * know which properties need special handling. `Y.Base` has a buildCfg which defines `ATTRS` for custom mix handling
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * (to protect the static config objects), and `Y.Widget` has a buildCfg which specifies `HTML_PARSER` for
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai * straight up aggregation.
6c65c3574a8e5039c6504276177d116d5c63efbdSatyen Desai *
10d8bafc5c24f3a4285cf6060a1935ba5cfc4b85Luke Smith * @method create
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * @static
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * @param {Function} name The name of the newly created class. Used to defined the NAME property for the new class.
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * @param {Function} main The base class which the new class should extend. This class needs to be Base or a class derived from base (e.g. Widget).
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * @param {Function[]} extensions The list of extensions which will be mixed into the built class.
af716e785a91e92d5cfa85d40fdd10a30f94751fSatyen Desai * @param {Object} px The set of prototype properties/methods to add to the built class.
af716e785a91e92d5cfa85d40fdd10a30f94751fSatyen Desai * @param {Object} sx The set of static properties/methods to add to the built class.
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * @return {Function} The newly created class.
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai */
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai Base.create = function(name, base, extensions, px, sx) {
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai return build(name, base, extensions, px, sx);
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai };
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai /**
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * <p>Mixes in a list of extensions to an existing class.</p>
10d8bafc5c24f3a4285cf6060a1935ba5cfc4b85Luke Smith * @method mix
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * @static
0709cd166604645c5511b892413b44ad6bce6b64Satyen Desai * @param {Function} main The existing class into which the extensions should be mixed. The class needs to be Base or a class derived from Base (e.g. Widget)
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * @param {Function[]} extensions The set of extension classes which will mixed into the existing main class.
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * @return {Function} The modified main class, with extensions mixed in.
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai */
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai Base.mix = function(main, extensions) {
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai return build(null, main, extensions, null, null, {dynamic:false});
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai };
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai /**
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * The build configuration for the Base class.
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai *
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * Defines the static fields which need to be aggregated
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * when the Base class is used as the main class passed to
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * the <a href="#method_Base.build">Base.build</a> method.
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai *
10d8bafc5c24f3a4285cf6060a1935ba5cfc4b85Luke Smith * @property _buildCfg
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * @type Object
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * @static
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * @final
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai * @private
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai */
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai Base._buildCfg = {
0709cd166604645c5511b892413b44ad6bce6b64Satyen Desai custom : {
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai ATTRS : function(prop, r, s) {
fa1ed07d84c327f796559ea1cf4f4ccb5209bd45Satyen Desai
fa1ed07d84c327f796559ea1cf4f4ccb5209bd45Satyen Desai r.ATTRS = r.ATTRS || {};
fa1ed07d84c327f796559ea1cf4f4ccb5209bd45Satyen Desai
fa1ed07d84c327f796559ea1cf4f4ccb5209bd45Satyen Desai if (s.ATTRS) {
fa1ed07d84c327f796559ea1cf4f4ccb5209bd45Satyen Desai
fa1ed07d84c327f796559ea1cf4f4ccb5209bd45Satyen Desai var sAttrs = s.ATTRS,
fa1ed07d84c327f796559ea1cf4f4ccb5209bd45Satyen Desai rAttrs = r.ATTRS,
fa1ed07d84c327f796559ea1cf4f4ccb5209bd45Satyen Desai a;
fa1ed07d84c327f796559ea1cf4f4ccb5209bd45Satyen Desai
fa1ed07d84c327f796559ea1cf4f4ccb5209bd45Satyen Desai for (a in sAttrs) {
fa1ed07d84c327f796559ea1cf4f4ccb5209bd45Satyen Desai if (sAttrs.hasOwnProperty(a)) {
fa1ed07d84c327f796559ea1cf4f4ccb5209bd45Satyen Desai rAttrs[a] = rAttrs[a] || {};
fa1ed07d84c327f796559ea1cf4f4ccb5209bd45Satyen Desai Y.mix(rAttrs[a], sAttrs[a], true);
fa1ed07d84c327f796559ea1cf4f4ccb5209bd45Satyen Desai }
fa1ed07d84c327f796559ea1cf4f4ccb5209bd45Satyen Desai }
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai }
b66fb0b516da11d7d0a3e6151dab92af15eac49cSatyen Desai },
b66fb0b516da11d7d0a3e6151dab92af15eac49cSatyen Desai _NON_ATTRS_CFG : arrayAggregator
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai },
969d790cf689400dd37fcf1f11c1909a66c06de9Satyen Desai aggregates : ["_PLUG", "_UNPLUG"]
10d8bafc5c24f3a4285cf6060a1935ba5cfc4b85Luke Smith };