OSDN Git Service

Version 0.6.115, fix X.Class & X.Node.Selector for Opera Mobile 12, fix X.Audio.
[pettanr/clientJs.git] / 0.6.x / js / 01_core / 11_XClass.js
1 /**\r
2  * Class を定義し システムの管理下に置く.\r
3  * 全てのクラスと pool が有効の場合インスタンスへの参照が保持される.\r
4  *  1. X.Class.create( opt_settings, opt_name, opt_privateClass, opt_props ) でクラスを登録.\r
5  *  2. コンストラクタ となるメソッドは、opt_props 内の Constructor : function( arg ){ ... }, に書く.\r
6  *  3. 通常通り new で インスタンス生成\r
7  *  4. kill() でオブジェクトをクリーンして削除、pool が有効の場合は pool される.\r
8  *  5. pool が有効の場合、new で pool されたインスタンスが返される.\r
9  *  6. \r
10  * \r
11  */\r
12 \r
13 // ------------------------------------------------------------------------- //\r
14 // ------------ local variables -------------------------------------------- //\r
15 // ------------------------------------------------------------------------- //\r
16 var X_Class_CLASS_LIST         = [],\r
17         X_Class_DEF_LIST           = [],\r
18         X_Class_PRIVATE_CLASS_LIST = [],\r
19         X_Class_PRIVATE_DEF_LIST   = [],\r
20         X_Class_CALLING_SUPER      = [],\r
21         X_Class_CALL_SUPER_STACK   = [],\r
22         X_Class_killPrivateFlag    = false,\r
23         X_Class_traits             = null,\r
24         X_Class_useObjectCreate    = false, // !!Object.create, http://jsperf.com/prototype-vs-object-create-perf\r
25         X_Class_use_proto_         = !X_UA.OperaMobile && !X_UA.OperaTablet && !!X.emptyFunction.prototype.__proto__,\r
26                 // Opera Mobile 12.10 Android11 IS01 でクラスのメンバが欠落する問題に遭遇。__proto__ を使わないと動作,,,\r
27 \r
28 /** \r
29  * X.Class.create で定義されたクラスのインスタンスが共通で備えるメソッド を格納\r
30  *\r
31  * @class\r
32  */ \r
33 X_Class_CommonProps =\r
34 \r
35 {\r
36         /*\r
37          * インスタンスの破棄。\r
38          * TODO kill したインスタンスのイベントが残っていないか?これは開発用のみ\r
39          */\r
40         kill : function(){\r
41                 var instance = this,\r
42                         klass    = X_Class_getClass( instance ),\r
43                         def      = X_Class_getClassDef( klass ),\r
44                         data, p, i;\r
45                 if( def.isPrivate && !X_Class_killPrivateFlag ){\r
46                         X.Logger.critical( 'PrivateInstance.kill() work in PrivateUser.kill().' );\r
47                         return;\r
48                 };\r
49                 X_Class_killPrivateFlag = false; // onKill 内で PrivateInstance.kill() を防ぐため\r
50                 \r
51                 // onKill() === false の場合、kill のキャンセル\r
52                 // private      は false での キャンセル は無視される\r
53                 \r
54                 if( this.instanceOf( X.EventDispatcher ) ){\r
55                         //console.log( 'this.instanceOf( X.EventDispatcher )! ' + this._dispatching );\r
56                         if( !def.isPrivate ){\r
57                                 if( this._dispatching ){\r
58                                         this.dispatch( X.Event.BEFORE_KILL_INSTANCE );\r
59                                         this._killReserved = true;\r
60                                         this.dispatch( X.Event.KILL_INSTANCE_CANCELED );\r
61                                         return;\r
62                                 } else\r
63                                 if( this.dispatch( X.Event.BEFORE_KILL_INSTANCE ) & X.Callback.PREVENT_DEFAULT ){\r
64                                         this.dispatch( X.Event.KILL_INSTANCE_CANCELED );\r
65                                         return;\r
66                                 };\r
67                         } else {\r
68                                 this.dispatch( X.Event.BEFORE_KILL_INSTANCE );  \r
69                         };\r
70                         this.dispatch( X.Event.KILL_INSTANCE );\r
71                         this._listeners && X_EventDispatcher_systemUnlisten( this ); //.unlisten();\r
72                 } else\r
73                 if( X.Type.isFunction( instance.onKill ) && instance.onKill() === false && !def.isPrivate ){\r
74                         return;\r
75                 };\r
76                 \r
77                 for( p in instance ){\r
78                         if( instance.hasOwnProperty && !instance.hasOwnProperty( p ) ) continue;\r
79                         delete instance[ p ];\r
80                 };\r
81                 if( def.pool ){\r
82                         def.live && def.live.splice( def.live.indexOf( instance ), 1 );\r
83                         def.pool[ def.pool.length ] = instance;\r
84                 };\r
85                 if( def.privateClass ){\r
86                         i = def.userList.indexOf( instance );\r
87                         if( i !== -1 ){\r
88                                 data = X_Class_getPrivate( instance );\r
89                                 X_Class_killPrivateFlag = true;\r
90                                 if( data._dispatching && data.instanceOf( X.EventDispatcher ) ){\r
91                                         data._killReserved = true;\r
92                                 } else {\r
93                                         data.kill();\r
94                                 };\r
95                                 def.dataList.splice( i, 1 );\r
96                                 def.userList.splice( i, 1 );\r
97                         };\r
98                 };\r
99         },\r
100         \r
101         /*  クラス定義を辿ってスーパークラスのコンストラクタを探す。\r
102          *  呼び出したコンストラクタは配列に控える。\r
103          *  さらに呼ばれた場合、配列を元にさらに奥のコンストラクタを取得\r
104          *  TODO 現在 new しているインスタンスを保持してチェックする\r
105          */\r
106         Super : function(){\r
107                 var sClass = this,\r
108                         i      = X_Class_CALLING_SUPER.indexOf( sClass ),\r
109                         n      = -1,\r
110                         l, sList, def, sConst, ret;\r
111         \r
112                 if( i === -1 ){\r
113                         X_Class_CALLING_SUPER[ l = X_Class_CALLING_SUPER.length ] = sClass;\r
114                         X_Class_CALL_SUPER_STACK[ l ] = sList = [];\r
115                 } else {\r
116                         sList = X_Class_CALL_SUPER_STACK[ i ];\r
117                 };\r
118                 \r
119                 while( sClass ){\r
120                         def    = X_Class_getClassDef( sClass );\r
121                         sClass = def.SuperClass;\r
122                         sConst = def.SuperConstructor;\r
123                         if( sConst && sList[ ++n ] !== sConst ){\r
124                                 sList[ n ] = sConst;\r
125                                 ret = sConst.apply( this, arguments );\r
126                                 --sList.length;\r
127                                 if( !sList.length ){\r
128                                         X_Class_CALLING_SUPER.splice( i, 1 );\r
129                                         X_Class_CALL_SUPER_STACK.splice( i, 1 );\r
130                                 };\r
131                                 return ret;\r
132                         };\r
133                 };\r
134                 console.log( 'スーパークラスのコンストラクタが見つかりません' );\r
135         },\r
136 \r
137         /*\r
138          * func について、親クラスで設定されている同名の関数メンバーを呼び出す\r
139          * 2つ以上の異なる名前で同じ関数がメンバーだった場合、失敗します\r
140          * 例) this.superCall( arguments.callee, param0, param1, ... )\r
141          */\r
142         superCall : function( func /* ...args */ ){\r
143                 var sClass = this,\r
144                         args   = arguments,\r
145                         name, p, sFunc, hit = false;\r
146                 if( X.Type.isFunction( func ) ){\r
147                         for( p in this ){\r
148                                 if( this[ p ] === func ){\r
149                                         name = p;\r
150                                         break;\r
151                                 };\r
152                         };\r
153                         if( !name ) return;\r
154                 } else {\r
155                         return;\r
156                 };\r
157                 \r
158                 if( X_EMPTY_OBJECT[ name ] ) return;\r
159                 \r
160                 while( sClass ){\r
161                         def    = X_Class_getClassDef( sClass );\r
162                         sClass = def.SuperClass;\r
163                         sFunc  = sClass.prototype[ name ];\r
164                         if( sFunc === func ){\r
165                                 hit = true; // 現在の関数にヒット\r
166                         } else\r
167                         if( hit && X_Object_inObject( name, this ) ){\r
168                                 if( X.Type.isFunction( sFunc ) ){\r
169                                         switch( args.length ){\r
170                                                 case 1 :\r
171                                                         return sFunc.call( this );\r
172                                                 case 2 :\r
173                                                         return sFunc.call( this, args[ 1 ] );\r
174                                                 case 3 :\r
175                                                         return sFunc.call( this, args[ 1 ], args[ 2 ] );\r
176                                                 case 4 :\r
177                                                         return sFunc.call( this, args[ 1 ], args[ 2 ], args[ 3 ] );\r
178                                                 default :\r
179                                                         args = X.Object.cloneArray( args );\r
180                                                         args.shift();\r
181                                                         return sFunc.apply( this, args );\r
182                                         };\r
183                                 };\r
184                                 break;\r
185                         };\r
186                 };\r
187         },\r
188         \r
189         /*\r
190          * TODO instanceof に対応したブラウザはそちらを使用\r
191          */\r
192         instanceOf : function( klass ){\r
193                 var Super = this;\r
194                 if( this.constructor === klass ) return true;\r
195                 while( Super = X_Class_getClassDef( Super ).SuperClass ){\r
196                         if( Super === klass ) return true;\r
197                 };\r
198                 return false;\r
199         }\r
200 };\r
201 \r
202 // ------------------------------------------------------------------------- //\r
203 // --- interface ----------------------------------------------------------- //\r
204 // ------------------------------------------------------------------------- //\r
205 \r
206 /** @namespace */ \r
207 X.Class = {\r
208         \r
209         NONE         : 0,\r
210         \r
211     /**\r
212      * インスタンスは破棄時(this.kill())に回収され、次回の new MyClass() 時に再利用されます。\r
213      * @memberof X.Class */\r
214         POOL_OBJECT  :  1,\r
215         \r
216         /**\r
217          * 定義するクラスは抽象クラスになります。new AbstractClass() とするとエラーになります。\r
218          * @memberof X.Class */\r
219         ABSTRACT     :  2,\r
220         \r
221         \r
222         /** @memberof X.Class */\r
223         FINAL        :  4,\r
224         /** @memberof X.Class */\r
225         SUPER_ACCESS :  8,\r
226         /** @memberof X.Class */\r
227         PRIVATE_DATA : 16,\r
228         /** @memberof X.Class */\r
229         SINGLETON    : 32, // 未実装\r
230         \r
231         create : function( /* displayName, classSetting, opt_PrivateClass, props */ ){\r
232                 var args        = X_Object_cloneArray( arguments ),\r
233                         displayName = args[ 0 ],\r
234                         classSetting,\r
235                         opt_pool, opt_abstract, opt_final, opt_private,\r
236                         privateDef,\r
237                         props,\r
238                         klass,\r
239                         classDef = {}, hash;\r
240                 if( X.Type.isString( displayName ) === true ){\r
241                         classDef.displayName = displayName;\r
242                         args.shift();\r
243                 };\r
244                 \r
245                 // クラス設定\r
246                 classDef.setting = classSetting = args[ 0 ];\r
247                 if( X.Type.isNumber( classSetting ) ){\r
248                         opt_pool     = !!( classSetting & X.Class.POOL_OBJECT  );\r
249                         opt_abstract = !!( classSetting & X.Class.ABSTRACT     );\r
250                         opt_final    = !!( classSetting & X.Class.FINAL        );\r
251                         opt_private  = !!( classSetting & X.Class.PRIVATE_DATA );\r
252                         if( opt_final && opt_abstract ){\r
253                                 X.Logger.critical( 'final & Abstract!' );\r
254                                 return;\r
255                         };      \r
256                         args.shift();\r
257                 } else {\r
258                         classDef.setting = 0;\r
259                 };\r
260                 \r
261                 // シャドウクラス\r
262                 if( X_Class_PRIVATE_CLASS_LIST.indexOf( args[ 0 ] ) !== -1 ){\r
263                         privateDef = X_Class_getClassDef( args[ 0 ] );\r
264                         if( privateDef.isPrivate !== true ){\r
265                                 X.Logger.critical( 'PrivateClass not found! please, X.Class.create( X.Class.PRIVATE, {...} ).' );\r
266                                 return;\r
267                         } else\r
268                         if( privateDef.Abstract === true ){\r
269                                 X.Logger.critical( 'PrivateClass is Abstract!' );\r
270                                 return;\r
271                         };\r
272                         classDef.privateClass = args.shift();\r
273                 };\r
274                 \r
275                 // インスタンスのメンバー\r
276                 props = args[ 0 ];\r
277                 if( !X.Type.isObject( props ) ){\r
278                         // サブクラスの場合、クラス定義の上書きがなくても作成可能\r
279                         // サブクラスでなくても、クラスメンバ用オブジェクトが無しでも作成可能\r
280                         //if( !X_Class_traits ){\r
281                         //      X.Logger.critical( 'No Class Def!' );\r
282                         //      return;\r
283                         //};\r
284                         props = {};\r
285                 } else\r
286                 if( props.Constructor && X.Type.isFunction( props.Constructor ) ){\r
287                         classDef.Constructor = props.Constructor;\r
288                 };\r
289 \r
290                 klass  = X_Callback_actualClosure( hash = { _ : X_Class_actualConstructor } ); // TODO hash = classDef\r
291                 hash.c = klass;\r
292                 klass.superClassOf = X_Class_superClassOf;\r
293                 klass.subClassOf   = X_Class_subClassOf;\r
294                 \r
295                 if( X_Class_useObjectCreate ){\r
296                         klass.prototype = X_Class_override( X_Class_override( X_Class_traits || klass.prototype, props, true ), X_Class_CommonProps, false );\r
297                         klass.prototype.constructor = klass;\r
298                 } else\r
299                 if( X_Class_use_proto_ ){\r
300                         X_Class_override( klass.prototype, props, true );\r
301                         if( X_Class_traits ){\r
302                                 klass.prototype.__proto__ = X_Class_traits;\r
303                         } else {\r
304                                 X_Class_override( klass.prototype, X_Class_CommonProps, false );\r
305                         };\r
306                 } else {\r
307                         klass.prototype = X_Class_override( X_Class_override( X_Class_traits || klass.prototype, props, true ), X_Class_CommonProps, false );\r
308                         klass.prototype.constructor = klass;\r
309                 };\r
310                 klass.name = displayName;\r
311                 \r
312                 if( opt_abstract ){\r
313                         classDef.Abstract = true;\r
314                 } else\r
315                 if( opt_pool ){\r
316                         classDef.pool = [];\r
317                         if( opt_private === false ) classDef.live = [];\r
318                 };                      \r
319                 if( opt_final ){\r
320                         classDef.Final = true;\r
321                 } else {\r
322                         klass.inherits = X_Class_inherits;\r
323                 };                      \r
324                 if( opt_private ){\r
325                         if( classDef.privateClass ){\r
326                                 X.Logger.critical( 'Private Data Class has no PrivateClass!' );\r
327                                 return;\r
328                         };\r
329                         classDef.isPrivate = true;\r
330                         X_Class_PRIVATE_CLASS_LIST.push( klass );\r
331                         X_Class_PRIVATE_DEF_LIST.push( classDef );\r
332                 } else {\r
333                         X_Class_CLASS_LIST.push( klass );\r
334                         X_Class_DEF_LIST.push( classDef );                              \r
335                 };\r
336                 return klass;\r
337         },\r
338         \r
339         _newPrivate  : X_Class_newPrivate,\r
340         \r
341         _getPrivate  : X_Class_getPrivate\r
342         \r
343 };\r
344 \r
345 // ------------------------------------------------------------------------- //\r
346 // --- implements ---------------------------------------------------------- //\r
347 // ------------------------------------------------------------------------- //\r
348 function X_Class_getClass( instance ){\r
349         var cList    = X_Class_CLASS_LIST,\r
350                 i        = cList.length,\r
351                 klass;\r
352         for( ; i; ){\r
353                 klass = cList[ --i ];\r
354                 if( instance.constructor === klass ) return klass;\r
355         };\r
356         cList = X_Class_PRIVATE_CLASS_LIST;\r
357         i     = cList.length;\r
358         for( ; i; ){\r
359                 klass = cList[ --i ];\r
360                 if( instance.constructor === klass ) return klass;\r
361         };\r
362         \r
363         if( cList.indexOf( instance ) !== -1 ) return instance;\r
364         if( X_Class_CLASS_LIST.indexOf( instance ) !== -1 ) return instance;\r
365 };\r
366 \r
367 function X_Class_getClassDef( KlassOrInstance ){\r
368         var i = X_Class_CLASS_LIST.indexOf( KlassOrInstance );\r
369         if( i === -1 ) i = X_Class_CLASS_LIST.indexOf( X_Class_getClass( KlassOrInstance ) );\r
370         if( i !== -1 ) return X_Class_DEF_LIST[ i ];\r
371         \r
372         i = X_Class_PRIVATE_CLASS_LIST.indexOf( KlassOrInstance );\r
373         if( i === -1 ) i = X_Class_PRIVATE_CLASS_LIST.indexOf( X_Class_getClass( KlassOrInstance ) );\r
374         if( i !== -1 ) return X_Class_PRIVATE_DEF_LIST[ i ];\r
375         \r
376         if( X_Class_DEF_LIST.indexOf( KlassOrInstance ) !== -1 ) return KlassOrInstance;\r
377         if( X_Class_PRIVATE_DEF_LIST.indexOf( KlassOrInstance ) !== -1 ) return KlassOrInstance;\r
378 };\r
379 \r
380 function X_Class_newPrivate( /* instance, args */ ){\r
381         var args         = X_Object_cloneArray( arguments ),\r
382                 user         = args.shift(),\r
383                 def          = X_Class_getClassDef( user ),\r
384                 privateClass = def.privateClass,\r
385                 privateDef   = X_Class_getClassDef( privateClass ),\r
386                 i            = -1;\r
387         if( def.userList ){\r
388                 i = def.userList.indexOf( user );\r
389         } else {\r
390                 def.userList = [];\r
391                 def.dataList = [];\r
392         };\r
393         if( i !== -1 ){\r
394                 X.Logger.critical( 'PrivateData already exist!' );\r
395                 return;\r
396         };\r
397         if( privateDef._tempUser ){\r
398                 X.Logger.critical( 'newPrivate を連続呼び出しされたところ破綻' );\r
399                 return;\r
400         };\r
401         privateDef._tempUser = user;\r
402         return X_Class_actualConstructor( privateClass( X_Closure_COMMAND_BACK ), args );// privateClass.__new( args );\r
403 };\r
404 \r
405 function X_Class_getPrivate( instance ){\r
406         var def = X_Class_getClassDef( instance ),\r
407                 i   = def.userList.indexOf( instance );\r
408         if( i !== -1 ) return def.dataList[ i ];\r
409 };\r
410 \r
411 /* over のプロパティを target にコピーする.ただし target の プロパティが優先, force で解除 */\r
412 function X_Class_override( target, src, force ){\r
413         var p;\r
414         for( p in src ){\r
415                 if( p === 'Constructor' ) continue;\r
416                 if( p === '__proto__' || p === 'prototype' || p === 'constructor' ){\r
417                         X.Logger.critical( p + ' is reserved!' );\r
418                         return;\r
419                 };\r
420                 if( force || target[ p ] === void 0 ){\r
421                         target[ p ] = src[ p ];\r
422                 };\r
423         };\r
424         return target;\r
425 };\r
426 \r
427 function X_Class_superClassOf( klass ){\r
428         var myDef      = X_Class_getClassDef( this ),\r
429                 targetDef  = X_Class_getClassDef( klass ),\r
430                 SuperClass = klass;\r
431 \r
432         if( !myDef || !targetDef || this === klass ) return false;\r
433         \r
434         while( SuperClass = X_Class_getClassDef( SuperClass ).SuperClass ){\r
435                 if( SuperClass === this ) return true;\r
436         };\r
437         \r
438         return false;\r
439 };\r
440 \r
441 function X_Class_subClassOf( klass ){\r
442         return X_Class_superClassOf.call( klass, this );\r
443 };\r
444         \r
445 /* サブクラスを作るメソッド  \r
446  * var subClass = superClass.inherits( ... ) \r
447  * http://d.hatena.ne.jp/m-hiyama/20051018/1129605002\r
448  */\r
449 function X_Class_inherits( /* displayName, classSetting, opt_PrivateClass, props */ ){\r
450         var args        = X_Object_cloneArray( arguments ),\r
451                 params      = [],\r
452                 Super       = this,\r
453                 superDef    = X_Class_getClassDef( Super ),\r
454                 displayName = args[ 0 ],\r
455                 classSetting,\r
456                 //opt_super,\r
457                 klass, def;\r
458         if( superDef.Final ) X.Logger.critical( 'X.Class inherits, Class is final!' );\r
459         \r
460         // サブクラス名\r
461         if( X.Type.isString( displayName ) ){\r
462                 args.shift();\r
463         } else {\r
464                 displayName = 'SubClass of ' + superDef.displayName;\r
465         };\r
466         params.push( displayName );\r
467         \r
468         // サブクラス設定\r
469         classSetting = args[ 0 ];\r
470         if( X.Type.isNumber( classSetting ) ){\r
471                 args.shift();\r
472         } else {\r
473                 // クラス設定がない場合、親からコピーして、Abstract flag は落とす??\r
474                 classSetting = superDef.setting;// &= ~X.Class.ABSTRACT;\r
475         };\r
476         if( superDef.isPrivate ) classSetting = classSetting | X.Class.PRIVATE_DATA;\r
477         //opt_super = !!( classSetting & X.Class.SUPER_ACCESS );\r
478         params.push( classSetting );\r
479 \r
480         // サブクラスのシャドウ\r
481         if( args[ 0 ] && X_Class_getClass( args[ 0 ] ) ){\r
482                 params.push( args.shift() );\r
483         } else\r
484         if( superDef.privateClass ){\r
485                 params.push( superDef.privateClass );\r
486         };\r
487         \r
488         /* props 未定義でも可 */\r
489         params.push( args[ 0 ] );\r
490         \r
491         // 継承クラスの作成\r
492         if( X_Class_useObjectCreate ){\r
493                 X_Class_traits = Object.create( Super.prototype );\r
494         } else\r
495         if( X_Class_use_proto_ ){\r
496                 X_Class_traits = Super.prototype;\r
497         } else {\r
498                 X_Class_traits = new Super( X_Closure_COMMAND_DROP );\r
499         };\r
500         klass  = X.Class.create.apply( X.Class, params );\r
501         X_Class_traits = null;\r
502         \r
503         def    = X_Class_getClassDef( klass );\r
504         // 継承用プロパティを控える\r
505         //if( opt_super === true ){\r
506                 //def.superAccess = true;\r
507                 def.SuperClass  = Super;\r
508                 def.SuperProto  = Super.prototype;\r
509                 def.SuperConstructor = superDef.Constructor || superDef.SuperConstructor;\r
510         // else {\r
511         //      def.SuperClass = Super; // instanceOf() で親クラスを調べる!\r
512         //};\r
513         \r
514         return klass;\r
515 };\r
516         \r
517 /*\r
518  * new の実体.コンストラクタの機能は instance.Constructor に書く.\r
519  * これにより pool された オブジェクト(破棄されたインスタンス) を再利用できる\r
520  */\r
521 function X_Class_actualConstructor( obj, args ){\r
522         var klass    = obj.c,//this,\r
523                 def      = X_Class_getClassDef( klass ),\r
524                 dataUser = def._tempUser,\r
525                 instance, obj,\r
526                 userDef;\r
527         if( def.Abstract ){\r
528                 X.Logger.critical( 'AbstractClass!' );\r
529                 return;\r
530         };\r
531         if( def.isPrivate && !dataUser ){\r
532                 X.Logger.critical( 'use myClass.newPrivate( instance, ...args )!' );\r
533                 return;\r
534         };\r
535         \r
536         instance = def.pool && def.pool.length > 0 ?\r
537                                         def.pool.pop() :\r
538                                 X_Class_useObjectCreate ?\r
539                                         Object.create( klass.prototype ) :\r
540                                         new klass( X_Closure_COMMAND_DROP );\r
541         \r
542         if( def.isPrivate ){\r
543                 userDef = X_Class_getClassDef( dataUser );\r
544                 userDef.dataList.push( instance );\r
545                 userDef.userList.push( dataUser );\r
546                 instance.User = dataUser;\r
547                 def._tempUser = null;\r
548         } else {\r
549                 def.live && def.live.push( instance );\r
550         };\r
551         //if( def.superAccess ){\r
552                 // TODO klass.prototype に移動\r
553                 //instance.Super = def.SuperProto;\r
554                 //instance.SuperConstructor = X_Class_superConstructor;\r
555         //};\r
556         obj = def.Constructor ?\r
557                         def.Constructor.apply( instance, args ) :\r
558                 def.SuperConstructor &&\r
559                         def.SuperConstructor.apply( instance, args );\r
560         if( ( X.Type.isObject( obj ) && obj !== instance ) || X.Type.isFunction( obj ) ){ // Class\r
561                 instance.kill();\r
562                 return obj;\r
563         };\r
564         return instance;\r
565 };\r
566 \r
567 console.log( 'X.Core.Class' );\r