🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano
Quick start
Production
use CloudCastle\Clock\Contract\ClockInterface;
use CloudCastle\Clock\SystemClock;
final class InvoiceService
{
public function __construct(private readonly ClockInterface $clock)
{
}
public function issue(): Invoice
{
return new Invoice(issuedAt: $this->clock->now());
}
}
$service = new InvoiceService(SystemClock::utc());
Test
use CloudCastle\Clock\MockClock;
$clock = MockClock::from('2026-01-01 00:00:00', 'UTC');
$service = new InvoiceService($clock);
$invoice = $service->issue(); // always 2026-01-01
$clock->advance(86_400.0); // a day passes instantly
Durations and deadlines
use CloudCastle\Clock\Deadline;
use CloudCastle\Clock\TimeSpan;
$timeout = TimeSpan::fromString('1m 30s');
$deadline = Deadline::after($clock, $timeout);
while (!$deadline->isExpired()) {
// time-bounded work; $deadline->remaining() is the leftover
}
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano