public static function factoryFromScheduleExpression(ScheduleExpression $scheduleExpression)
    {

        // prepare the CRON expression
        $cronExpression = sprintf(
            '%s %s %s %s %s %s %s',
            $scheduleExpression->getSecond(),
            $scheduleExpression->getMinute(),
            $scheduleExpression->getHour(),
            $scheduleExpression->getDayOfMonth(),
            $scheduleExpression->getMonth(),
            $scheduleExpression->getDayOfWeek(),
            $scheduleExpression->getYear()
        );

        // return the point in time at which the next timer expiration is scheduled to occur
        return new CalendarBasedTimeout($cronExpression, $scheduleExpression, new FieldFactory());
    }