1 // ==========================================================================
  2 // Project:   The M-Project - Mobile HTML5 Application Framework
  3 // Copyright: �2010 M-Way Solutions GmbH. All rights reserved.
  4 // Creator:   Dominik
  5 // Date:      26.10.2010
  6 // License:   Dual licensed under the MIT or GPL Version 2 licenses.
  7 //            http://github.com/mwaylabs/The-M-Project/blob/master/MIT-LICENSE
  8 //            http://github.com/mwaylabs/The-M-Project/blob/master/GPL-LICENSE
  9 // ==========================================================================
 10 
 11 m_require('core/foundation/m.js');
 12 
 13 /**
 14  * @class
 15  *
 16  * Base class of all objects.
 17  */
 18 
 19 /**
 20  * @constructor
 21  */
 22 M.Object =
 23 /** @scope M.Object.prototype */ {
 24 
 25     /**
 26      * The type of this object.
 27      *
 28      * @type String
 29      */
 30     type: 'M.Object',
 31 
 32     /**
 33      * Creates an object.
 34      * 
 35      * @param obj
 36      */
 37     create: function(obj) {
 38         var f = function(){};
 39         f.prototype = obj;
 40         return new f();
 41     },
 42 
 43     /**
 44      * Creates a new class and extends it with all functions of the defined super class
 45      * The function takes multiple input arguments. Each argument serves as additional
 46      * super classes - see mixins.
 47      */
 48     extend: function(){
 49         var f = function(){};
 50         for(prop in this) {
 51             f.prototype[prop] = this[prop];
 52         }
 53         for(var i = 0; i < arguments.length; i++) {
 54             var obj = arguments[i];
 55             for(prop in obj) {
 56                 f.prototype[prop] = obj[prop];
 57             }
 58         }
 59         return new f();
 60     },
 61 
 62     include: function() {
 63         for(var i = 0; i < arguments.length; i++) {
 64             var obj = arguments[i];
 65             for(prop in obj) {
 66                 this[prop] = obj[prop];
 67             }
 68         }
 69     },
 70 
 71     /**
 72      * Binds a method to its caller, so it is always executed within the right scope.
 73      *
 74      * @param {Object} caller The scope of the method that should be bound.
 75      * @param {Object} method The method to be bound.
 76      * @param {Object} arg One or more arguments. If more, then apply is used instead of call.
 77      */
 78     bindToCaller: function(caller, method, arg) {
 79         return function() {
 80             if(_.isArray(arg)) {
 81                 return method.apply(caller, arg);
 82             }
 83             return method.call(caller, arg);
 84         }
 85     },
 86 
 87     /**
 88      * Returns the class property behind the given key.
 89      *
 90      * @param {String} key The key of the property to be returned.
 91      */
 92     get: function(key) {
 93         return this[key];
 94     },
 95 
 96     /**
 97      * Returns the class property behind the given key.
 98      *
 99      * @param {String} key The key of the property to be changed.
100      * @param {Object, String} value The value to be set.
101      */
102     set: function(key, value) {
103         this[key] = value;
104     },
105 
106     /**
107      * This method will remove an object from the DOM and then delete it. 
108      */
109     destroy: function() {
110         if(this.id && $('#' + this.id)) {
111             //TODO: use page did close event...
112             //$('#' + this.id).remove();
113         }
114         delete this;
115     }
116 
117 };