Adding extra charsets for ActionMailer unit tests, if you're looking to parse incomin...
[akelos.git] / lib / AkObject.php
blob2bcc771a5fc6b197693733f7f15cbfa172108bc1
1 <?php
2 /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
4 // +----------------------------------------------------------------------+
5 // | Akelos Framework - http://www.akelos.org |
6 // +----------------------------------------------------------------------+
7 // | Copyright (c) 2002-2006, Akelos Media, S.L. & Bermi Ferrer Martinez |
8 // | Released under the GNU Lesser General Public License, see LICENSE.txt|
9 // +----------------------------------------------------------------------+
11 /**
12 * @package ActiveSupport
13 * @subpackage Compatibility
14 * @author Bermi Ferrer <bermi a.t akelos c.om>
15 * @copyright Copyright (c) 2002-2006, Akelos Media, S.L. http://www.akelos.org
16 * @license GNU Lesser General Public License <http://www.gnu.org/copyleft/lesser.html>
19 if(!class_exists('AkObject')){
21 /**
22 * Allows for __construct and __destruct to be used in PHP4.
24 * A hack to support __construct() on PHP 4
25 * Hint: descendant classes have no PHP4 class_name()
26 * constructors, so this one gets called first and calls the
27 * top-layer __construct() which (if present) should call
28 * parent::__construct()
30 * @author Bermi Ferrer <bermi a.t akelos c.om>
31 * @copyright Copyright (c) 2002-2005, Akelos Media, S.L. http://www.akelos.org
32 * @license GNU Lesser General Public License <http://www.gnu.org/copyleft/lesser.html>
34 class AkObject
39 // ------ CLASS METHODS ------ //
44 // ---- Public methods ---- //
47 // {{{ AkObject()
49 /**
50 * A hack to support __construct() on PHP 4
52 * Hint: descendant classes have no PHP4 class_name()
53 * constructors, so this one gets called first and calls the
54 * top-layer __construct() which (if present) should call
55 * parent::__construct()
57 * @access public
58 * @return void
60 function AkObject()
62 static $_callback_called;
63 Ak::profile('Instantiating '.get_class($this));
64 $args = func_get_args();
65 // register_shutdown_function(array(&$this, '__destruct'));
66 ____ak_shutdown_function(&$this);
67 call_user_func_array(array(&$this, '__construct'), $args);
69 if(empty($_callback_called)){
70 $_callback_called = true;
71 register_shutdown_function('____ak_shutdown_function');
75 // }}}
76 // {{{ toString()
78 /**
79 * Object-to-string conversion
81 * Each class can override it as necessary
83 * @access public
84 * @return string in this case returns this class name
86 function toString()
88 return get_class($this);
91 function __toString()
93 return $this->toString();
96 // }}}
99 // ---- Protected methods ---- //
102 // {{{ __construct()
105 * Class constructor, overriden in descendant classes
107 * @access protected
108 * @return void
110 function __construct()
115 // }}}
116 // {{{ __destruct()
119 * Class destructor, overriden in descendant classes
121 * @access protected
122 * @return void
124 function __destruct()
126 unset($this);
130 // }}}
133 // {{{ __clone()
136 * Clone class (Zend Engine 2 compatibility trick)
138 function __clone()
140 return $this;
143 // }}}
145 function log($message, $type = '', $identifyer = '')
147 require_once 'Log.php';
148 $ident = empty($ident) ? 'main' : $ident;
150 $log = Log::singleton('file', AK_LOGS_DIR.DS.$ident.'.log',$ident);
151 $log->log($type, $message);
156 * Unsets circular reference children that are not freed from memory
157 * when calling unset() or when the parent object is garbage collected.
159 * @see http://paul-m-jones.com/?p=262
160 * @see http://bugs.php.net/bug.php?id=33595
162 function freeMemory()
164 // We can't use get_class_vars as it does not include runtime assigned attributes
165 foreach (array_keys((array)$this) as $attribute){
166 if(isset($this->$attribute)){
167 unset($this->$attribute);
175 function ____ak_shutdown_function($details = false)
177 static $___registered_objects;
178 if(!$details){
179 Ak::profile('Calling shutdown destructors');
180 foreach (array_keys($___registered_objects) as $k){
181 if(!empty($___registered_objects[$k]) && is_object($___registered_objects[$k]) && method_exists($___registered_objects[$k],'__destruct')){
182 Ak::profile('Calling destructor for '.get_class($___registered_objects[$k]));
183 $___registered_objects[$k]->__destruct();
186 }else{
187 $___registered_objects[] =& $details;