protected function launch($element, $argument, $memoized) { if (is_array($element)) { $mem = array(); // Memoization foreach ($element as $sub) { $temp = $this->launch($sub, $argument, false); if (!is_null($temp)) { $mem[] = $temp; } } return $mem; } elseif ($element instanceof \collections\ILaunched) { $element->init($argument, $memoized); return $element->launch(NULL); } elseif ($element instanceof \Closure || is_callable($element)) { return $memoized ? call_user_func_array($element, $argument) : $element($argument); } elseif (\Launcher::can_boot($element)) { return \Launcher::boot($element); } return $element; // Default }