(int) $value, self::FLOAT => (float) $value, self::STRING => (string) $value, self::BOOL => (bool) $value, self::ARRAY => is_array($value) ? $value : json_decode($value, true), self::DATE => $value instanceof \DateTime ? $value : new \DateTime($value), }; } public function isCastable(mixed $value): bool { try { return match ($this) { self::INT, self::FLOAT => is_numeric($value), self::STRING => is_scalar($value) || (is_object($value) && method_exists($value, '__toString')), self::BOOL => is_bool($value) || in_array($value, [0, 1, '0', '1'], true), self::ARRAY => is_array($value) || is_string($value) && json_decode($value, true) !== null, self::DATE => $value instanceof \DateTime || (is_string($value) && strtotime($value) !== false), }; } catch (\Throwable $e) { return false; } } public function type(): string { return match ($this) { self::INT => 'INTEGER', self::FLOAT => 'FLOAT', self::STRING => 'VARCHAR(255)', self::BOOL => 'BOOLEAN', self::ARRAY => 'JSON', self::DATE => 'DATETIME', }; } }