OSDN Git Service

Client is version 0.5.40, fixed Panel.picture_id
authoritozyun <itozyun@user.sourceforge.jp>
Sun, 13 Jan 2013 07:24:12 +0000 (16:24 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Sun, 13 Jan 2013 07:24:12 +0000 (16:24 +0900)
app/assets/javascripts/peta-common.js
app/assets/javascripts/system.js

index e552cf7..94de697 100644 (file)
@@ -1,6 +1,6 @@
 /*\r
  * pettanR peta.common.js\r
- *   version 0.5.39\r
+ *   version 0.5.40\r
  * \r
  *   author:\r
  *     itozyun\r
@@ -40,7 +40,7 @@ var pettanr = ( function(){
                })(),\r
                IS_DEBUG = Type.isBoolean( URL_PARAMS.debug ) ? URL_PARAMS.debug : IS_LOCAL === true;\r
        return {\r
-               version: '0.5.39',\r
+               version: '0.5.40',\r
                URL_PARAMS: URL_PARAMS,\r
                LOCAL: IS_LOCAL,\r
                DEBUG: IS_DEBUG,\r
@@ -630,7 +630,7 @@ pettanr.bind = ( function(){
                NAMESPACE_CLASSNAME = pettanr.CONST.NS_PETTANR_COMIC + '-',\r
                PICTURE_PATH        = pettanr.CONST.PANEL_PICTURE_PATH,\r
                ELM_DETECT_WIDTH    = ( function(){\r
-                       var ret = document.createElement( 'div');\r
+                       var ret = document.createElement( 'div' );\r
                        ret.style.cssText = 'width: auto;height: 0;padding: 0;margin: 0;display: block;visibility: hidden;float: none;position: static;';\r
                        return ret;\r
                })(),\r
@@ -675,173 +675,178 @@ pettanr.bind = ( function(){
        };\r
        \r
        \r
-       var ElementBuilderClass = function( elmTarget, noClassnameMode ){\r
-               var RIMG_ARRAY     = [],\r
-                       BALLOON_ARRAY  = [];\r
-               \r
-               function buildComicElement(){\r
+       var ElementBuilder = function( elmTarget, noClassname ){\r
+               this.imageList    = [];\r
+               this.balloonList  = [];\r
+               this.elmTarget    = elmTarget;\r
+               this.noClassname  = noClassname;\r
+       };\r
+       ElementBuilder.prototype = {\r
+               build : function( json, zoom ){\r
+                       this.clean();\r
                        \r
-               };\r
-               \r
-               function buildPanelElement( json, zoom ){\r
-                       var _elmPanel = document.createElement( 'div' ),\r
-                               _style = {\r
+                       // json is Comic ? Panel ?\r
+                       var panels = json.children || json.stories,\r
+                               i, l;\r
+                       if( Type.isArray( panels ) === true ){\r
+                               // comic\r
+                               for( i = 0, l = panels.length; i<l; ++i ){\r
+                                       this.buildPanelElement( panels[ i ], zoom );\r
+                               };\r
+                       } else\r
+                       if( json.elements ){\r
+                               // panel\r
+                               this.buildPanelElement( json, zoom );\r
+                       } else {\r
+                               // invalid json\r
+                       };\r
+               },\r
+               buildComicElement : function(){\r
+                       \r
+               },\r
+               buildPanelElement : function( json, zoom ){\r
+                       var elmPanel = document.createElement( 'div' ),\r
+                               style = {\r
                                                'border-width':         typeof json.border === 'number' ? json.border + 'px' : 0,\r
-                                               width:                          json.width + 'px',\r
+                                               width:                          json.width  + 'px',\r
                                                height:                         json.height + 'px'\r
                                },\r
-                               _cssText = [],\r
-                               _comicElements = json.elements || ( json.panel ? json.panel.elements : [] ),\r
-                               _comicElement, _elmImg, _rImg, _rPic,\r
-                               _balloon, _elmBalloonWrap, _elmText, _text, _speechesAttributes, _key,\r
-                               i, l;\r
-                       elmTarget.appendChild( _elmPanel );\r
+                               cssText = [],\r
+                               elements = json.elements || ( json.panel ? json.panel.elements : [] ),\r
+                               rPic,\r
+                               p, i, l;\r
+                       this.elmTarget.appendChild( elmPanel );\r
                        \r
-                       if( noClassnameMode === true ){\r
+                       if( this.noClassname === true ){\r
                                \r
                        } else {\r
-                               _elmPanel.className = NAMESPACE_CLASSNAME + 'panel';\r
+                               elmPanel.className = NAMESPACE_CLASSNAME + 'panel';\r
                        };\r
-                       for( _key in _style ){\r
-                               _cssText.push( _key + ':' + _style[ _key ] );\r
+                       for( p in style ){\r
+                               cssText.push( p + ':' + style[ p ] );\r
                        };\r
-                       _elmPanel.style.cssText = _cssText.join( ';' );\r
+                       elmPanel.style.cssText = cssText.join( ';' );\r
                        \r
-                       for( i = 0, l = _comicElements.length; i<l; ++i ){\r
-                               _comicElement = _comicElements[ i ];\r
-                               _rPic = _comicElement.picture;\r
-                               if( _rPic ){\r
-                                       _rImg = pettanr.image.createReversibleImage(\r
-                                                       [ PICTURE_PATH, _rPic.id, '.', _rPic.ext ].join( ''),\r
-                                                       _comicElement.width, _comicElement.height\r
-                                               );\r
-                                       _elmImg = _rImg.elm;\r
-                                       _elmPanel.appendChild( _elmImg );\r
-                                       _elmImg.className = NAMESPACE_CLASSNAME + 'image';\r
-                                       _elmImg.style.cssText = [\r
-                                               'left:',   _comicElement.x, 'px;',\r
-                                               'top:',    _comicElement.y, 'px;',\r
-                                               'z-index:',_comicElement.z, ';'\r
-                                       ].join( '');                                    \r
-                                       if( _elmImg.tagName === 'img' ){\r
-                                               _elmImg.width        = Math.abs( _comicElement.width );\r
-                                               _elmImg.height       = Math.abs( _comicElement.height );\r
-                                       } else {\r
-                                               _elmImg.style.width  = Math.abs( _comicElement.width ) + 'px';\r
-                                               _elmImg.style.height = Math.abs( _comicElement.height ) + 'px';\r
-                                       };\r
-                                       \r
-                                       RIMG_ARRAY.push( _rImg );\r
+                       for( i = 0, l = elements.length; i < l; ++i ){\r
+                               data = elements[ i ];\r
+                               rPic = data.picture;\r
+                               if( rPic ){\r
+                                       this.buildImage( elmPanel, data, rPic );\r
                                } else {\r
-                                       _elmBalloonWrap = document.createElement( 'div' );\r
-                                       _elmPanel.appendChild( _elmBalloonWrap );\r
-                                       _elmBalloonWrap.className = NAMESPACE_CLASSNAME + 'balloon';\r
-                                       _elmBalloonWrap.style.cssText = [\r
-                                               'width:',   _comicElement.width, 'px;',\r
-                                               'height:',  _comicElement.height, 'px;',\r
-                                               'left:',    _comicElement.x, 'px;',\r
-                                               'top:',     _comicElement.y, 'px;',\r
-                                               'z-index:', _comicElement.z, ';'\r
-                                       ].join( '');\r
-\r
-                                       _balloon = pettanr.balloon.createBalloon( _comicElement.width, _comicElement.height, _comicElement.tail );\r
-                                       _elmBalloonWrap.appendChild( _balloon.elm );\r
-                                       \r
-                                       _elmText = document.createElement( 'p' );\r
-                                       _elmBalloonWrap.appendChild( _elmText );\r
-                                       \r
-                                       _elmText.appendChild( document.createElement( 'span' ) );\r
-                                       \r
-                                       _text = '';\r
-                                       _speechesAttributes = _comicElement.speeches_attributes;\r
-                                       if( _speechesAttributes ){\r
-                                               for( _key in _speechesAttributes ){\r
-                                                       _text += _speechesAttributes[ _key ] && _speechesAttributes[ _key ].content ? _speechesAttributes[ _key ].content : '';\r
-                                               };\r
-                                       };\r
-                                       _elmText.firstChild.appendChild( document.createTextNode( _text ));\r
-                                       BALLOON_ARRAY.push( _balloon );\r
+                                       this.buildBalloon( elmPanel, data );\r
                                };\r
                        };\r
-               };\r
-               \r
-               function clean(){\r
-                       // clean elmTarget\r
-                       while( RIMG_ARRAY.length > 0 ){\r
-                               RIMG_ARRAY.shift().destroy();\r
-                       };\r
-                       while( BALLOON_ARRAY.length > 0 ){\r
-                               BALLOON_ARRAY.shift().destroy();\r
+               },\r
+               buildImage : function( elmPanel, data, rPic ){\r
+                       var rImg = pettanr.image.createReversibleImage(\r
+                                       [ PICTURE_PATH, data.picture_id, '.', rPic.ext ].join( '' ),\r
+                                       data.width, data.height\r
+                               ),\r
+                               elmImg = rImg.elm;\r
+                       elmPanel.appendChild( elmImg );\r
+                       elmImg.className = NAMESPACE_CLASSNAME + 'image';\r
+                       elmImg.style.cssText = [\r
+                               'left:',    data.x, 'px;',\r
+                               'top:',     data.y, 'px;',\r
+                               'z-index:', data.z, ';'\r
+                       ].join( '');                                    \r
+                       if( elmImg.tagName === 'img' ){\r
+                               elmImg.width        = Math.abs( data.width );\r
+                               elmImg.height       = Math.abs( data.height );\r
+                       } else {\r
+                               elmImg.style.width  = Math.abs( data.width ) + 'px';\r
+                               elmImg.style.height = Math.abs( data.height ) + 'px';\r
                        };\r
-                       Util.removeAllChildren( elmTarget );            \r
-               };\r
-               \r
-               this.build = function( json, zoom ){\r
-                       clean();\r
                        \r
-                       // json is Comic ? Panel ?\r
-                       var stories = json.children || json.stories,\r
-                               i, l;\r
-                       if( Type.isArray( stories ) === true ){\r
-                               // comic\r
-                               for( i = 0, l = stories.length; i<l; ++i ){\r
-                                       buildPanelElement( stories[ i ], zoom );\r
+                       this.imageList.push( rImg );                    \r
+               },\r
+               buildBalloon : function( elmPanel, data ){\r
+                       var elmBalloonWrap = document.createElement( 'div' ),\r
+                               elmText        = document.createElement( 'p' ),\r
+                               content        = '',\r
+                               speechesAttr   = data.speeches_attributes,\r
+                               balloon, p;\r
+                       elmPanel.appendChild( elmBalloonWrap );\r
+                       elmBalloonWrap.className = NAMESPACE_CLASSNAME + 'balloon';\r
+                       elmBalloonWrap.style.cssText = [\r
+                               'width:',   data.width, 'px;',\r
+                               'height:',  data.height, 'px;',\r
+                               'left:',    data.x, 'px;',\r
+                               'top:',     data.y, 'px;',\r
+                               'z-index:', data.z, ';'\r
+                       ].join( '');\r
+\r
+                       balloon = pettanr.balloon.createBalloon( data.width, data.height, data.tail );\r
+                       elmBalloonWrap.appendChild( balloon.elm );\r
+                       \r
+                       elmBalloonWrap.appendChild( elmText );\r
+                       \r
+                       elmText.appendChild( document.createElement( 'span' ) );\r
+                       \r
+                       if( speechesAttr ){\r
+                               for( p in speechesAttr ){\r
+                                       content += speechesAttr[ p ] && speechesAttr[ p ].content ? speechesAttr[ p ].content : '';\r
                                };\r
-                       } else\r
-                       if( json.elements ){\r
-                               // panel\r
-                               buildPanelElement( json, zoom );\r
-                       } else {\r
-                               // invalid json\r
                        };\r
-               };\r
-               this.zoom = function(){\r
-                       \r
-               };\r
-               this.destroy = function(){\r
-                       clean();\r
-               };\r
+                       elmText.firstChild.appendChild( document.createTextNode( content ));\r
+                       this.balloonList.push( balloon );\r
+               },\r
+               clean : function(){\r
+                       // clean elmTarget\r
+                       while( this.imageList.length > 0 ){\r
+                               this.imageList.shift().destroy();\r
+                       };\r
+                       while( this.balloonList.length > 0 ){\r
+                               this.balloonList.shift().destroy();\r
+                       };\r
+                       Util.removeAllChildren( this.elmTarget );       \r
+               },\r
+               zoom : function(){},\r
+               destroy : function(){\r
+                       this.clean();\r
+               }                       \r
        };\r
        \r
-       var BindWorkerClass = function( elmTarget, json, zoomSelfEnabled, noClassnameMode ){\r
-               var builder    = new ElementBuilderClass( elmTarget, noClassnameMode );\r
-               var elmDetectW = ELM_DETECT_WIDTH.cloneNode( false );\r
-               var resizer    = null;\r
-               \r
+       var BindWorker = function( elmTarget, json, zoomSelfEnabled, noClassname ){\r
+               this.builder     = new ElementBuilder( elmTarget, noClassname );\r
+               this.elmDetectW  = ELM_DETECT_WIDTH.cloneNode( false );\r
+               this._json        = json;\r
+               this.noClassname = noClassname;\r
                if( zoomSelfEnabled === true ){\r
-                       elmTarget.parentNode.insertBefore( elmDetectW, elmTarget );\r
-                       resizer = new ResizeAgentClass( onResize, elmDetectW );\r
+                       elmTarget.parentNode.insertBefore( this.elmDetectW, elmTarget );\r
+                       this.resizer = new ResizeAgentClass( onResize, this.elmDetectW );\r
                };\r
                function onResize(){\r
                        \r
                };\r
-               json && typeof json === 'object' && builder.build( json );\r
-               \r
-               this.init = function(){\r
+               json && typeof json === 'object' && this.builder.build( json );\r
+       };\r
+       BindWorker.prototype = {\r
+               init : function(){\r
                                \r
-               };\r
-               this.zoom = function(){\r
-                       builder.zoom();\r
-               };\r
-               this.json = function( _json ){\r
-                       json = _json;\r
-                       builder.build( _json );\r
-               };\r
-               this.targetElement = function(){\r
+               },\r
+               zoom : function(){\r
+                       this.builder.zoom();\r
+               },\r
+               json : function( json ){\r
+                       this._json = json;\r
+                       this.builder.build( json, this.noClassname );\r
+               },\r
+               targetElement : function(){\r
                                \r
-               };\r
-               this.layout = function(){\r
+               },\r
+               layout : function(){\r
                                \r
-               };\r
-               this.destroy = function(){\r
-                       builder.destroy();\r
-                       elmTarget = json = builder = null;\r
-               };\r
+               },\r
+               destroy : function(){\r
+                       this.builder.destroy();\r
+                       delete this.json;\r
+                       delete this.builder;\r
+               }               \r
        };\r
-       \r
        return {\r
                createBindWorker: function( elmTarget, opt_COMICJSONorPANELJSON, opt_zoomSelfEnabled, opt_noClassnameMode ){\r
-                       var ret = new BindWorkerClass( elmTarget, opt_COMICJSONorPANELJSON, !!opt_zoomSelfEnabled, !!opt_noClassnameMode);\r
+                       var ret = new BindWorker( elmTarget, opt_COMICJSONorPANELJSON, !!opt_zoomSelfEnabled, !!opt_noClassnameMode );\r
                        BIND_WORKER_ARRAY.push( ret );\r
                        return ret;\r
                },\r
index e142fa0..366a44a 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * pettanR system.js
- *   version 0.5.39
+ *   version 0.5.40
  *
  * gadgetOS
  *   author:
  * 
  */
 var Class = ( function(){
-       var CLASS_LIST   = [],
-               DEF_LIST     = [],
-               PRIVATE_LIST = [];
+       var CLASS_LIST             = [],
+               DEF_LIST               = [],
+               CONSTRUCTOR  = 'Constructor';
        
        function getClass( instance ){
-               var list     = CLASS_LIST,
-                       i        = list.length,
+               var clist    = CLASS_LIST,
+                       dlist    = DEF_LIST,
+                       i        = clist.length,
                        getIndex = Util.getIndex,
                        klass, def, live, pool;
                for( ; i; ){
-                       klass = list[ --i ];
-                       def   = getDef( klass );
-                       if( def.live && getIndex( def.live, instance ) !== -1 ) return klass;
+                       klass = clist[ --i ];
+                       //def   = dlist[ i ];
+                       //if( def.live && getIndex( def.live, instance ) !== -1 ) return klass;
                        if( def.pool && getIndex( def.pool, instance ) !== -1 ) return klass;
                        if( instance instanceof klass ) return klass;
                };
-               throw new Error( 'Class not found!' );
+               // throw new Error( 'Class not found!' );
        };
        
-       function getDef( klass ){
-               var i = Util.getIndex( CLASS_LIST, klass );
+       function getClassDef( KlassOrInstance ){
+               var i = Util.getIndex( CLASS_LIST, KlassOrInstance );
+               if( i === -1 ) i = Util.getIndex( CLASS_LIST, getClass( KlassOrInstance ) );
                if( i !== -1 ) return DEF_LIST[ i ];
        };
        
        /* over のプロパティを target にコピーする.ただし target の プロパティが優先, force で解除 */
        function override( target, over, force ){
                for( var p in over ){
+                       if( p === CONSTRUCTOR ) continue;
                        if( force === true || typeof target[ p ] === 'undefined' ){
                                target[ p ] = over[ p ];
                        };
@@ -163,73 +166,107 @@ var Class = ( function(){
         * var subClass = superClass.inherits( ... ) 
         * http://d.hatena.ne.jp/m-hiyama/20051018/1129605002
         */
-       function inherits( def, opt_pool, opt_abstract, opt_final, opt_super, opt_PrivateClass ){
-               var Super = this,
-                       def   = getDef( Super ),
+       function inherits( /* classSetting, opt_PrivateClass, props */ ){
+               var args         = c( arguments ),
+                       Super        = this,
+                       superDef     = getClassDef( Super ),
+                       classSetting = args[ 0 ],
+                       opt_super,
+                       opt_privateClass,
                        Traits, klass;
+               if( superDef.Final === true ) throw new Error( 'Class is final!' );
+               if( Type.isNumber( classSetting ) === true ){
+                       opt_super = classSetting & Class.SUPER_ACCESS === 1;
+                       args.shift();
+               };
+               opt_privateClass = getClass( args[ 0 ] );
+               opt_privateClass && args.shift();
                abstractFlag = false;
                Traits       = new Super;
                abstractFlag = true;
-               klass = Class.create( override( Traits, def, true ), opt_pool, opt_abstract, opt_final, opt_PrivateClass );
-               if( opt_super === true ){
-                       def.Super = Super.prototype;
-               };
+               klass = Class.create( classSetting, opt_privateClass || superDef.privateClass, override( Traits, args[ 0 ], true ) );
+               if( opt_super === true ) getClassDef( klass ).Super = Super.prototype;
                return klass;
        };
        
        /* Class.create で作られたクラスのインスタンスが共通で備えるメソッド */
-       var basic = {
+       var ClassBase = {
                kill : function(){
                        var instance = this,
-                               p, v,
+                               p,
                                klass = getClass( instance ),
-                               def   = getDef( klass ),
+                               def   = getClassDef( klass ),
                                privateData, i;
-                       Type.isFunction( o.onKill ) === true && o.onKill();
+                       Type.isFunction( instance.onKill ) === true && instance.onKill();
                        
                        for( p in instance ){
                                if( instance.hasOwnProperty && !instance.hasOwnProperty( p ) ) continue;
-                               v = instance[ p ];
                                delete instance[ p ];
                        };
                        if( def.pool ){
-                               klass.live.splice( Util.getIndex( klass.live, instance ), 1 );
-                               klass.pool.push( instance );
+                               def.live.splice( Util.getIndex( def.live, instance ), 1 );
+                               def.pool.push( instance );
                        };
                        if( def.privateClass ){
-                               privateData = instance.getPrivateData();
-                               privateData && privateData.kill();
+                               privateData = klass.getPrivateData( instance );
+                               if( privateData ){
+                                       privateData.kill();
+                                       i = Util.getIndex( def.dataList, privateData );
+                                       def.dataList.splice( i, 1 );
+                                       def.userList.splice( i, 1 );                            
+                               };
                        };
-                       if( def.isPrivate === true ){
-                               i = Util.getIndex( def.dataList, instance );
-                               def.dataList.splice( i, 1 );
-                               def.userList.splice( i, 1 );
+                       // myCallback の削除
+                       // myCallback を受け取った API への通知
+               },
+               myCallback : function( callback ){
+                       var def       = getClassDef( this ),
+                               iList     = def.callbackInstanceList,
+                               rList     = def.callbackRegisterList,
+                               i, clist, myCallback;
+                       if( !iList ){
+                               iList = def.callbackInstanceList = [];
+                               rList = def.callbackRegisterList = [];
+                       };
+                       i     = Util.getIndex( iList, this );
+                       clist = rList[ i ];
+                       if( index === -1 ){
+                               index = iList.length;
+                               cList = [];
+                               iList.push( this );
+                               rList.push( cList );
+                       } else {
+                               for( i = cList.length; i; ){
+                                       if( cList[ --i ].callback === callback ) return cList[ i ];
+                               };
                        };
+                       myCallback = new Callback( this, callback );
+                       cList.push( myCallback );
+                       return myCallback;
                }
        };
        /* privateDataclass をもつクラスに追加されるメソッド */
        function newPrivateData( instance /*, args */ ){
-               var klass = getDef( getClass( instance ) ).privateClass,
-                       def   = getDef( klass ),
-                       i     = Util.getIndex( def.userList, instance ),
-                       args  = c( arguments ),
+               var def          = getClassDef( instance ),
+                       privateClass = def.privateClass,
+                       i            = Util.getIndex( def.userList, instance ),
+                       args         = c( arguments ),
                        data;
-               if( i === -1 ){
-                       throw new Error( 'Private already exist!' );
+               if( i !== -1 ){
+                       throw new Error( 'PrivateData already exist!' );
                };
                privateFlag = false;
                args.unshift();
-               data = I.apply( klass, args );
+               data = I.apply( privateClass, args );
                privateFlag = false;
                def.dataList.push( data );
                def.userList.push( instance );
                return data;
        };
        function getPrivateData( instance ){
-               var klass = getDef( getClass( instance ) ).privateClass,
-                       def   = getDef( klass ),
-                       i     = Util.getIndex( def.userList, instance );
-               if( i !== -1 ) return def.userList[ i ];
+               var def = getClassDef( instance ),
+                       i   = Util.getIndex( def.userList, instance );
+               if( i !== -1 ) return def.dataList[ i ];
        };
        
        /*
@@ -240,12 +277,12 @@ var Class = ( function(){
                privateFlag  = true,
                f = true,
                c = Util.copyArray,
-               a, dataUser;
+               a;
        function I(){
                var klass = this,
-                       def   = getDef( klass ),   
+                       def   = getClassDef( klass ),   
                        instance;
-               if( def.abstract === true ){
+               if( def.Abstract === true || abstractFlag === false ){
                        if( abstractFlag === true ){
                                throw new Error( 'AbstractClass!' );
                        };
@@ -264,55 +301,84 @@ var Class = ( function(){
                        instance = new klass();
                        f = true;
                };
-               if( def.Super ){
+               if( def.Super && !instance.Super ){
                        instance.Super = def.Super;
                };
-               instance.Constructor && instance.Constructor.apply( instance, c( arguments ) );
+               def[ CONSTRUCTOR ] && def[ CONSTRUCTOR ].apply( instance, c( arguments ) );
                def.live && def.live.push( instance );
                return instance;
        };
        
        return {
-               create : function( def, opt_pool, opt_abstract, opt_final, opt_PrivateClass ){
-                       var klass = function(){
-                                       a = arguments;
-                                       if( f ) return I.apply( a.callee, c( a ) );
-                               },
-                               def   = {},
-                               _def;
-                       klass.prototype = override( def, basic, false );
+               POOL_OBJECT  : 1,
+               ABSTRACT     : 2,
+               FINAL        : 4,
+               SUPER_ACCESS : 8,
+               create : function( /* classSetting, opt_PrivateClass, props */ ){
+                       var args         = c( arguments ),
+                               classSetting = args[ 0 ],
+                               opt_pool, opt_abstract, opt_final,
+                               privateDef,
+                               props,
+                               klass,
+                               classDef = {};
+                       if( Type.isNumber( classSetting ) === true ){
+                               opt_pool     = classSetting & Class.POOL_OBJECT === 1;
+                               opt_abstract = classSetting & Class.ABSTRACT    === 1;
+                               opt_final    = classSetting & Class.FINAL       === 1;
+                               args.shift();
+                       };
                        if( opt_final === true && opt_abstract === true ){
                                throw new Error( 'final & Abstract!' );
+                       };                      
+                       
+                       privateDef = getClassDef( args[ 0 ] );
+                       if( privateDef ){
+                               if( privateDef.isPrivate !== true ){
+                                       throw new Error( 'PrivateClass not found! please, Class.createPrivateData().' );
+                               } else
+                               if( privateDef.Abstract === true ){
+                                       throw new Error( 'PrivateClass is Abstract!' );
+                               } else {
+                                       classDef.privateClass = args[ 0 ];
+                                       klass.newPrivateData  = newPrivateData;
+                                       klass.getPrivateData  = getPrivateData;
+                                       args.shift();
+                               };                      
+                       };
+                       props = args[ 0 ]
+                       if( props === null || Type.isObject( props ) === false ){
+                               throw new Error( 'No Class Def!' );
+                       };
+                       
+                       klass = function(){ a = arguments; if( f ) return I.apply( a.callee, c( a ) )};
+                       klass.prototype = override( override( {}, props, true ), ClassBase, false );
+
+                       if( Type.isFunction( props[ CONSTRUCTOR ] ) === true ){
+                               classDef[ CONSTRUCTOR ] = props[ CONSTRUCTOR ];
                        };
                        if( opt_final !== true ){
                                klass.inherits = inherits;
+                       } else {
+                               def.Final = true;
                        };
                        if( opt_abstract === true ){
-                               def.abstract = true;
+                               classDef.Abstract = true;
                        } else 
                        if( opt_pool === true ){
-                               def.pool = [];
-                               def.live = [];
-                       };
-                       if( opt_PrivateClass ){
-                               _def = getDef( opt_PrivateClass );
-                               if( !_def || _def.isPrivate !== true ){
-                                       throw new Error( 'PrivateClass not found! please, Class.createPrivateData().' );
-                               };
-                               def.privateClass  = opt_PrivateClass;
-                               klass.newPrivateData = newPrivateData;
-                               klass.getPrivateData = getPrivateData;
+                               classDef.pool = [];
+                               classDef.live = [];
                        };
                        CLASS_LIST.push( klass );
-                       DEF_LIST.push( def );
+                       DEF_LIST.push( classDef );
                        return klass;
                },
-               createPrivateData : function( def, opt_abstract, opt_final ){
-                       var klass = Class.create( def, true, opt_abstract, opt_final ),
-                               def   = getDef( klass );
-                       def.isPrivate = true;
-                       def.userList  = [];
-                       def.dataList  = [];
+               createPrivateData : function( props, opt_abstract, opt_final ){
+                       var klass    = Class.create( props, true, opt_abstract, opt_final ),
+                               classDef = getClassDef( klass );
+                       classDef.isPrivate = true;
+                       classDef.userList  = [];
+                       classDef.dataList  = [];
                        return klass;
                },
                onShutdown : function(){
@@ -321,6 +387,53 @@ var Class = ( function(){
        };
 })();
 
+/**
+ * Callback 時に thisObject や args を指定したい場合に使用. 
+ */
+var Callback = Class.create(
+       Class.POOL_OBJECT | Class.FINAL, {
+       Constructor : function( thisObject, callback, opt_args ){
+               if( Type.isFunction( callback ) === false ){
+                       throw new Error( 'Not function!' );
+               };
+               this.callback = callback;
+               if( thisObject ) this.thisObject = thisObject;
+               if( Type.isArray( opt_args ) === true ){
+                       this.args = opt_args;
+               } else
+               if( opt_args !== undefined ){
+                       this.arg = opt_args;
+               };
+       },
+       fire : function( /* args */ ){
+               var thisObject = this.thisObject || window,
+                       args       = Util.copyArray( arguments );
+               if( 0 < args.length ){
+                       if( this.args !== undefined ){
+                               args.push.apply( args, this.args );
+                       } else
+                       if( this.arg !== undefined ){
+                               args.push( this.arg );
+                       };
+                       this.callback.apply( thisObject, args );
+               } else {
+                       if( this.args !== undefined ){
+                               this.callback.apply( thisObject, this.args );
+                       } else
+                       if( this.arg !== undefined ){
+                               this.callback.call( thisObject, this.arg );
+                       } else {
+                               this.callback.call( thisObject );
+                       };
+               };
+       },
+       registerUser : function( user ){
+               
+       },
+       onKill : function(){
+       }
+});
+
 var TicketBase = function(){
        this.kill = function(){
                var t = this, v, p;