summaryrefslogtreecommitdiffstats
path: root/vendor/dragonmantank/cron-expression/src/Cron/FieldFactory.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/dragonmantank/cron-expression/src/Cron/FieldFactory.php')
-rw-r--r--vendor/dragonmantank/cron-expression/src/Cron/FieldFactory.php52
1 files changed, 52 insertions, 0 deletions
diff --git a/vendor/dragonmantank/cron-expression/src/Cron/FieldFactory.php b/vendor/dragonmantank/cron-expression/src/Cron/FieldFactory.php
new file mode 100644
index 0000000..839b275
--- /dev/null
+++ b/vendor/dragonmantank/cron-expression/src/Cron/FieldFactory.php
@@ -0,0 +1,52 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Cron;
+
+use InvalidArgumentException;
+
+/**
+ * CRON field factory implementing a flyweight factory.
+ *
+ * @see http://en.wikipedia.org/wiki/Cron
+ */
+class FieldFactory implements FieldFactoryInterface
+{
+ /**
+ * @var array Cache of instantiated fields
+ */
+ private $fields = [];
+
+ /**
+ * Get an instance of a field object for a cron expression position.
+ *
+ * @param int $position CRON expression position value to retrieve
+ *
+ * @throws InvalidArgumentException if a position is not valid
+ */
+ public function getField(int $position): FieldInterface
+ {
+ return $this->fields[$position] ?? $this->fields[$position] = $this->instantiateField($position);
+ }
+
+ private function instantiateField(int $position): FieldInterface
+ {
+ switch ($position) {
+ case CronExpression::MINUTE:
+ return new MinutesField();
+ case CronExpression::HOUR:
+ return new HoursField();
+ case CronExpression::DAY:
+ return new DayOfMonthField();
+ case CronExpression::MONTH:
+ return new MonthField();
+ case CronExpression::WEEKDAY:
+ return new DayOfWeekField();
+ }
+
+ throw new InvalidArgumentException(
+ ($position + 1) . ' is not a valid position'
+ );
+ }
+}