[], '__run' => true, '__exec' => NULL, ]; protected $__initConfig = []; final public function __construct(array $__options = []) { $__options = $this->extend(TRUE, self::$__classPattern, $__options); $__boot = [ '__Core_Object_T_Boot_propDef' => [ 'lookup' => function(array $c, $n, array $l) { array_walk($l, function($v, $p) use ($n, &$c) { $c[$p] = $this->Core_Object_T_Boot_handleLookup($p, $n, $c) + [ 'value' => $v ]; $value = &$c[$p]['value']; if(isset($value) && is_array($value) && is_array($v) && in_array($p, ['class'])) $value = $this->extend(TRUE, $v, $value); }); return $c; }, 'init' => function(array $c) { array_walk($c, function($s, $p) { extract($s); $this->__initConfig[$p] = $value; }); return $c; } ], '__Core_Object_T_Boot_propAsp' => [ 'lookup' => function(array $c, $n, array $l) { array_walk($l, function($v, $p) use ($n, &$c) { if(is_integer($p)) { $p = $v; $v = TRUE; } $c[$p] = $this->Core_Object_T_Boot_handleLookup($p, $n, $c) + [ 'asp' => $v ]; }); return $c; }, 'complete' => function(array $c) { array_walk($c, function(&$s, $p) { extract($s); if(FALSE === $exists || FALSE === $asp) return; $m = ['set', 'unset', 'get', 'isset']; array_walk($m, function($a) use (&$s, $p) { $s += [(($e = method_exists($this, $m = 'aspectable'.$a.$p)) ? 'asp' : 'dir').$a => ($e ? $m : $p)]; }); }); return $c; } ], '__Core_Object_T_Boot_propCom' => [ 'lookup' => function(array $c, $n, array $l) { array_walk($l, function($v, $p) use ($n, &$c) { if(is_integer($p)) { $p = $v; $v = FALSE; } $c[$p] = $this->Core_Object_T_Boot_handleLookup($p, $n, $c) + [ 'flag' => $v ]; }); return $c; } ] ]; $__exec = is_callable($__options['__exec']) ? $__options['__exec'] : function() { $_ = self::$__Core_Object_T_Boot_Static[get_called_class()]; $c = $_['__Core_Object_T_Boot_propCom']; $d = $_['__Core_Object_T_Boot_propDef']; $a = $_['__Core_Object_T_Boot_propAsp']; $i = $this->__initConfig; $write = function($p, $v) use ($a) { if(!isset($a[$p])) return $v; extract($a[$p]); if(isset($dirset) || FALSE === $asp) return $this->$p = $v; if(isset($aspset)) return $this->$aspset($v); }; array_walk($d, function($s, $p) use ($i, $a, $write) { extract($s); if(FALSE === $exists) return; $write($p, $value); if(isset($this->$p)) return; $this->$p = $value; }); array_walk($c, function($s, $p) use ($i, $write) { if(FALSE === isset($i[$p])) return; $value = $i[$p]; extract($s); switch(TRUE): case is_array($value) && is_array($this->$p): switch($flag): case 'merge': $value = array_merge($this->$p, $value); break; case 'extend': $value = $this->extend($this->$p, $value); break; case 'recursive': $value = $this->extend(TRUE, $this->$p, $value); break; endswitch; break; case is_string($value) && is_string($this->$p): switch($flag): case 'append': $value = $this->$p.$value; break; case 'prepend': $value = $value.$this->$p; break; endswitch; break; endswitch; $write($p, $value); }); $this->__initConfig['__run'] = TRUE; unset($this->__initConfig['__exec']); }; unset($__options['__exec']); $this->Core_Object_T_Boot_emit($__boot)->__initConfig = $this->extend(TRUE, $this->__initConfig, $__options); TRUE === $this->__initConfig['__run'] ? $__exec() : $this->__initConfig['__exec'] = $__exec; } public function extend() { $a = func_get_args(); $t = $a[0]; $l = count($a); $r = FALSE; $i = 1; $f = function($v, $p) use (&$t, $r) { switch(TRUE): case is_array($t): $t[$p] = (TRUE === $r && is_array($v) && isset($t[$p]) && is_array($t[$p])) ? $this->extend($r, $t[$p], $v) : $v; break; case is_object($t): $t->$p = (TRUE === $r && is_array($v) && isset($t->$p) && is_array($t->$p)) ? $this->extend($r, $t->$p, $v) : $v; break; case is_string($t): if(FALSE === class_exists($t)) throw new Exception('Class '.$t.' not found.'); if(FALSE === property_exists($t, $p)) throw new Exception('Property '.$t.'::$'.$p.' not found.'); $t::$$p = (TRUE === $r && is_array($v) && is_array($t::${$p})) ? $this->extend($r, $t::$$p, $v) : $v; break; default: throw new Exception('Target not writable.'); endswitch; }; if(is_bool($t)) { $t = isset($a[1]) ? $a[1] : []; $r = $t; $i = 2; } if(FALSE === is_array($t) && FALSE === is_object($t) && FALSE === is_string($t)) $t = []; if($l === $i) { $t = $this; --$i; } for( ; $i < $l; $i++) { if(NULL === ($o = $a[$i])) continue; array_walk($o, $f); } return $t; } public function dump() { var_dump(self::$__Core_Object_T_Boot_Static); } }