public function untilAge($name, $closure, $max, $args = []) { $row = Light::Until()->firstOrCreate(['name' => $name]); $when = $row->when; $value = $row->value; if ($when && $value) { $age = time() - (int) $when; if ($age > $max) { $data = call_user_func_array($closure, $args); $row->setWhen(time())->setValue(serialize($data))->save(); } else { return unserialize($value); } } $data = call_user_func_array($closure, $args); $row->setWhen(time())->setValue(serialize($data))->save(); return $data; }