'{:root}', 'core' => '{:root}/core', 'coreInc' => '{:root}/core/inc/{:class}/{:method}/{:file}.php', // core lib contains 3rd party stuff 'coreLib' => '{:root}/core/lib', 'coreJs' => '{:root}/core/lib/js', 'coreCss' => '{:root}/core/lib/css', 'coreImg' => '{:root}/core/lib/img', 'coreIetf' => '{:root}/core/lib/ietf', 'corePie' => '{:root}/core/lib/pie', 'api' => '{:root}/core/api', 'apiScheme' => '{:root}/core/api/{:class}/{:method}/{:slug}/{:file}.xml', // std contains fallbacks for user replacable files 'std' => '{:root}/core/std', 'stdLib' => '{:root}/core/std/lib', 'stdImg' => '{:root}/core/std/lib/img', // wordpress includes 'wp' => '{:wp}', 'wpJs' => '{:wp}/js', 'wpCss' => '{:wp}/css' ]; public function __construct(array $__config) { Throwable::run(); if(TRUE === static::$__running) { if(TRUE === Theme::isDebug()) Trace::add(__METHOD__.': bypass'); return; } $__config += [ 'debug' => FALSE, 'versionID' => 0, 'version' => '0', ]; static::$__running = TRUE; static::$__config = &$__config; static::$__Hook = new Hook; try { $_ = [ Def::v(__const_Type::SPL_BOOLEAN), Def::v(__const_Type::SPL_STRING), Def::v(__const_Type::SPL_DIRECTORY), Def::v(__const_Type::SPL_INTEGER), ]; foreach(['slug', 'name', 'fullName', 'version', 'versionID', 'themePath', 'themeUri', 'wpIncludePath', 'wpIncludeUri', 'debug'] as $config) { if(!isset($__config[$config])) throw new Exception(String::insert('Missing configuration {:config}.', compact('config'))); switch($config): case 'themePath': case 'wpIncludePath': $__config[$config] = '/'.trim(rtrim($__config[$config], '/'), '/'); break; case 'themeUri': case 'wpIncludeUri': $__config[$config] = trim(rtrim($__config[$config], '/'), '/'); break; endswitch; if(TRUE === Theme::isDebug()) Trace::add(__METHOD__.': '.$config.': '.$__config[$config]); try { switch($config): case 'debug': $_[0]->set($__config[$config]); break; case 'slug': case 'name': case 'fullName': case 'version': case 'themeUri': case 'wpIncludeUri': $_[1]->set($__config[$config]); break; case 'themePath': case 'wpIncludePath': $_[2]->set($__config[$config]); break; case 'versionID': $_[3]->set($__config[$config]); break; endswitch; } catch(Exception $E) { throw new Exception('Illegal type for {:config} detected.', compact('config'), $E); } static::${'__'.$config} = $__config[$config]; unset($__config[$config]); } unset($_); } catch(\Exception $E) { throw new Exception('Theme Config Error', $E); } /* - current event: Application::boot() - after_setup_theme: - Application::run() - dequeue Actions - dequeue Filters - dequeue Callables - register shutdown showTrace() */ try { try { Application::boot(); } catch(\Exception $E) { throw new Exception('Boot Exec Error', $E); } try { Wp::addAction(Hook::ACTION_AFTER_SETUP_THEME, function() { try { Application::run(); } catch(\Exception $E) { Theme::e('Run Exec Error', $E); } try { Hook::dequeueFilters(); Hook::dequeueActions(); Hook::dequeueCallables(); } catch(\Exception $E) { Theme::e('Hook Dequeue Error', $E); } try { Wp::addAction(Hook::ACTION_SHUTDOWN, function() { if(FALSE === static::$__debug) return; print static::showTrace(); }); } catch(\Exception $E) { Theme::e('Registration Hook::ACTION_SHUTDOWN Error', $E); } }); } catch(\Exception $E) { throw new Exception('Registration Hook::ACTION_AFTER_SETUP_THEME Error', $E); } } catch(\Exception $E) { throw new Exception('Theme Application Error', $E); } Throwable::stop(); } static function __callStatic($__name, $__args) { $r = explode('_', $n = Inflector::underscore($__name)); switch($prefix = $r[0]): case 'path': case 'uri': array_shift($r); return isset(static::$__pathScheme[$r = lcfirst(Inflector::camelize(implode('_', $r)))]) ? String::insert(static::$__pathScheme[$r], [ 'root' => static::${'__theme'.('uri' === $prefix ? 'Uri' : 'Path')}, 'wp' => static::${'__wpInclude'.('uri' === $prefix ? 'Uri' : 'Path')}]) .(([] !== $__args) ? '/'.trim(rtrim(implode('/', $__args), '/'), '/') : '') : NULL; endswitch; } static function slug($__value = NULL) { return NULL === $__value ? static::$__slug : static::$__slug.'_'.$__value; } static function name() { return static::$__name; } static function fullname() { return static::$__fullname; } static function version() { return static::$__version; } static function versionID() { return static::$__versionID; } static function isDebug() { return static::$__debug; } static function config($__key = NULL, $__value = NULL) { if(TRUE === is_scalar($__key) && NULL !== $key) static::$__config[$__key] = $__value; return static::$__config; } static function showTrace() { return '
'.(new Trace).'
'; } /** * handle exceptions thrown in closures. * create throwable instance and forward track to wp_die() */ static function e() { $T = Invoke::emitClass('ILLI\Core\Std\Exception', func_get_args()); $m = '
'.$T->toTrack()->asText().'
'; $t = '
'.(new Trace).'
'; Throwable::stop(); Wp::wpDie($m.$t); } }