/** * Gets/sets current environment's object * * @param $set_current mixed * @return Current */ public static function current($set_current = null) { $called_class = get_called_class(); // set current (ignore Reflection_Property : to enable use of @default Class::current) if ($set_current && !is_a($set_current, Reflection_Property::class)) { static::$current = $set_current; if (!is_a($called_class, Plugin::class, true)) { Session::current()->set($set_current, Builder::current()->sourceClassName($called_class)); } } elseif (!isset(static::$current)) { // get current plugin from plugins manager if (is_a($called_class, Plugin::class, true)) { if ($called_class === Builder::class) { static::$current = new Builder(); } else { $plugin = Session::current()->plugins->get(Builder::current()->sourceClassName($called_class)); if (!isset(static::$current)) { static::$current = $plugin; } } } else { static::$current = Session::current()->get($called_class); } } return static::$current; }
/** * Load a counter linked to the class of an object from default data link and increment it * * @param $object object The object to use to format the counter * @param $identifier string The identifier of the counter ; default is get_class($object) * @return string The new counter value */ public static function increment($object, $identifier = null) { Dao::begin(); if (empty($identifier)) { $identifier = Builder::current()->sourceClassName(get_class($object)); } $counter = Dao::searchOne(['identifier' => $identifier], get_called_class()) ?: new Counter($identifier); $next_value = $counter->next($object); Dao::write($counter); Dao::commit(); return $next_value; }
/** * @param $sources Reflection_Source[] Key is the file path * @return Reflection_Source[] added sources list */ public function moreSourcesToCompile(&$sources) { $added = []; foreach ($sources as $file_path => $source) { if (!strpos($file_path, SL)) { $reload = true; break; } } if (isset($reload)) { $old_compositions = Builder::current()->getCompositions(); $old_levels = Session::current()->plugins->getAll(true); if (isset(Main::$current)) { Main::$current->resetSession(); } $new_compositions = Builder::current()->getCompositions(); $new_levels = Session::current()->plugins->getAll(true); // add classes where builder composition changed foreach ($old_compositions as $class_name => $old_composition) { if (!isset($new_compositions[$class_name]) || $old_composition != $new_compositions[$class_name] || is_array($old_composition) && (array_diff($old_composition, $new_compositions[$class_name]) || array_diff($new_compositions[$class_name], $old_composition))) { $this->moreSourcesAdd($class_name, $sources, $added); } } foreach ($new_compositions as $class_name => $new_composition) { if (!isset($old_compositions[$class_name])) { $this->moreSourcesAdd($class_name, $sources, $added); } } // add classes of globally added/removed plugins foreach ($old_levels as $level => $old_plugins) { foreach ($old_plugins as $class_name => $old_plugin) { if (!isset($new_levels[$level][$class_name])) { $this->moreSourcesAdd($class_name, $sources, $added); } } } foreach ($new_levels as $level => $new_plugins) { foreach ($new_plugins as $class_name => $new_plugin) { if (!isset($old_levels[$level][$class_name])) { $this->moreSourcesAdd($class_name, $sources, $added); } } } } return $added; }
/** * Extends the list of sources to compile * * When you modify a file, all these classes may have their matching mysql structure changed : * - the class itself * - all classes that extend the class or use the trait * * @param &$sources Reflection_Source[] * @return Reflection_Source[] added sources list */ public function moreSourcesToCompile(&$sources) { $added = []; // Builder is disabled during the listing as we want to get the original linked class name when // reading class annotation @link Builder::current()->enabled = false; /** @var $search Dependency */ $search = Search_Object::create(Dependency::class); $search->file_name = Func::notLike('cache/%'); $search->type = Func::orOp([Dependency::T_EXTENDS, Dependency::T_USE]); foreach ($sources as $source) { foreach ($source->getClasses() as $class) { while ($linked_class = $class->getAnnotation('link')->value) { $source = Reflection_Class::of($linked_class)->source; if (!isset($sources[$source->file_name])) { $sources[$source->file_name] = $source; $added[$source->file_name] = $source; } $class = $source->getClass($linked_class); } $search->dependency_name = $class->name; foreach (Dao::search($search, Dependency::class) as $dependency) { /** @var $dependency Dependency */ if (!isset($sources[$dependency->file_name])) { $source = new Reflection_Source($dependency->file_name); $sources[$dependency->file_name] = $source; $added[$dependency->file_name] = $source; } } } } Builder::current()->enabled = true; return $added; }