1<?php 2 3/** 4 * webtrees: online genealogy 5 * Copyright (C) 2023 webtrees development team 6 * This program is free software: you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation, either version 3 of the License, or 9 * (at your option) any later version. 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * You should have received a copy of the GNU General Public License 15 * along with this program. If not, see <https://www.gnu.org/licenses/>. 16 */ 17 18declare(strict_types=1); 19 20namespace Fisharebest\Webtrees; 21 22use Fisharebest\Webtrees\Contracts\CacheFactoryInterface; 23use Fisharebest\Webtrees\Contracts\CalendarDateFactoryInterface; 24use Fisharebest\Webtrees\Contracts\ContainerInterface; 25use Fisharebest\Webtrees\Contracts\ElementFactoryInterface; 26use Fisharebest\Webtrees\Contracts\EncodingFactoryInterface; 27use Fisharebest\Webtrees\Contracts\FamilyFactoryInterface; 28use Fisharebest\Webtrees\Contracts\FilesystemFactoryInterface; 29use Fisharebest\Webtrees\Contracts\GedcomRecordFactoryInterface; 30use Fisharebest\Webtrees\Contracts\HeaderFactoryInterface; 31use Fisharebest\Webtrees\Contracts\IdFactoryInterface; 32use Fisharebest\Webtrees\Contracts\ImageFactoryInterface; 33use Fisharebest\Webtrees\Contracts\IndividualFactoryInterface; 34use Fisharebest\Webtrees\Contracts\LocationFactoryInterface; 35use Fisharebest\Webtrees\Contracts\MarkdownFactoryInterface; 36use Fisharebest\Webtrees\Contracts\MediaFactoryInterface; 37use Fisharebest\Webtrees\Contracts\NoteFactoryInterface; 38use Fisharebest\Webtrees\Contracts\RepositoryFactoryInterface; 39use Fisharebest\Webtrees\Contracts\ResponseFactoryInterface; 40use Fisharebest\Webtrees\Contracts\RouteFactoryInterface; 41use Fisharebest\Webtrees\Contracts\SharedNoteFactoryInterface; 42use Fisharebest\Webtrees\Contracts\SlugFactoryInterface; 43use Fisharebest\Webtrees\Contracts\SourceFactoryInterface; 44use Fisharebest\Webtrees\Contracts\SubmissionFactoryInterface; 45use Fisharebest\Webtrees\Contracts\SubmitterFactoryInterface; 46use Fisharebest\Webtrees\Contracts\SurnameTraditionFactoryInterface; 47use Fisharebest\Webtrees\Contracts\TimeFactoryInterface; 48use Fisharebest\Webtrees\Contracts\TimestampFactoryInterface; 49use Fisharebest\Webtrees\Contracts\XrefFactoryInterface; 50 51/** 52 * Provide access to factory objects and those that represent external entities (filesystems, caches) 53 */ 54class Registry 55{ 56 private static CacheFactoryInterface $cache_factory; 57 58 private static CalendarDateFactoryInterface $calendar_date_factory; 59 60 private static ContainerInterface $container; 61 62 private static ElementFactoryInterface $element_factory; 63 64 private static EncodingFactoryInterface $encoding_factory; 65 66 private static FamilyFactoryInterface $family_factory; 67 68 private static FilesystemFactoryInterface $filesystem_factory; 69 70 private static GedcomRecordFactoryInterface $gedcom_record_factory; 71 72 private static HeaderFactoryInterface $header_factory; 73 74 private static IdFactoryInterface $id_factory; 75 76 private static ImageFactoryInterface $image_factory; 77 78 private static IndividualFactoryInterface $individual_factory; 79 80 private static LocationFactoryInterface $location_factory; 81 82 private static MarkdownFactoryInterface $markdown_factory; 83 84 private static MediaFactoryInterface $media_factory; 85 86 private static NoteFactoryInterface $note_factory; 87 88 private static RepositoryFactoryInterface $repository_factory; 89 90 private static ResponseFactoryInterface $response_factory; 91 92 private static RouteFactoryInterface $route_factory; 93 94 private static SharedNoteFactoryInterface $shared_note_factory; 95 96 private static SlugFactoryInterface $slug_factory; 97 98 private static SourceFactoryInterface $source_factory; 99 100 private static SubmissionFactoryInterface $submission_factory; 101 102 private static SubmitterFactoryInterface $submitter_factory; 103 104 private static SurnameTraditionFactoryInterface $surname_tradition_factory; 105 106 private static TimeFactoryInterface $time_factory; 107 108 private static TimestampFactoryInterface $timestamp_factory; 109 110 private static XrefFactoryInterface $xref_factory; 111 112 /** 113 * Store or retrieve a factory object. 114 * 115 * @param CacheFactoryInterface|null $factory 116 * 117 * @return CacheFactoryInterface 118 */ 119 public static function cache(CacheFactoryInterface $factory = null): CacheFactoryInterface 120 { 121 if ($factory instanceof CacheFactoryInterface) { 122 self::$cache_factory = $factory; 123 } 124 125 return self::$cache_factory; 126 } 127 128 /** 129 * Store or retrieve a factory object. 130 * 131 * @param CalendarDateFactoryInterface|null $factory 132 * 133 * @return CalendarDateFactoryInterface 134 */ 135 public static function calendarDateFactory(CalendarDateFactoryInterface $factory = null): CalendarDateFactoryInterface 136 { 137 if ($factory instanceof CalendarDateFactoryInterface) { 138 self::$calendar_date_factory = $factory; 139 } 140 141 return self::$calendar_date_factory; 142 } 143 144 /** 145 * Store or retrieve a PSR-11 container. 146 * 147 * @param ContainerInterface|null $container 148 * 149 * @return ContainerInterface 150 */ 151 public static function container(ContainerInterface $container = null): ContainerInterface 152 { 153 if ($container instanceof ContainerInterface) { 154 self::$container = $container; 155 } 156 157 return self::$container; 158 } 159 160 /** 161 * Store or retrieve a factory object. 162 * 163 * @param ElementFactoryInterface|null $factory 164 * 165 * @return ElementFactoryInterface 166 */ 167 public static function elementFactory(ElementFactoryInterface $factory = null): ElementFactoryInterface 168 { 169 if ($factory instanceof ElementFactoryInterface) { 170 self::$element_factory = $factory; 171 } 172 173 return self::$element_factory; 174 } 175 176 /** 177 * Store or retrieve a factory object. 178 * 179 * @param EncodingFactoryInterface|null $factory 180 * 181 * @return EncodingFactoryInterface 182 */ 183 public static function encodingFactory(EncodingFactoryInterface $factory = null): EncodingFactoryInterface 184 { 185 if ($factory instanceof EncodingFactoryInterface) { 186 self::$encoding_factory = $factory; 187 } 188 189 return self::$encoding_factory; 190 } 191 192 /** 193 * Store or retrieve a factory object. 194 * 195 * @param FamilyFactoryInterface|null $factory 196 * 197 * @return FamilyFactoryInterface 198 */ 199 public static function familyFactory(FamilyFactoryInterface $factory = null): FamilyFactoryInterface 200 { 201 if ($factory instanceof FamilyFactoryInterface) { 202 self::$family_factory = $factory; 203 } 204 205 return self::$family_factory; 206 } 207 208 /** 209 * Store or retrieve a factory object. 210 * 211 * @param FilesystemFactoryInterface|null $factory 212 * 213 * @return FilesystemFactoryInterface 214 */ 215 public static function filesystem(FilesystemFactoryInterface $factory = null): FilesystemFactoryInterface 216 { 217 if ($factory instanceof FilesystemFactoryInterface) { 218 self::$filesystem_factory = $factory; 219 } 220 221 return self::$filesystem_factory; 222 } 223 224 /** 225 * Store or retrieve a factory object. 226 * 227 * @param GedcomRecordFactoryInterface|null $factory 228 * 229 * @return GedcomRecordFactoryInterface 230 */ 231 public static function gedcomRecordFactory(GedcomRecordFactoryInterface $factory = null): GedcomRecordFactoryInterface 232 { 233 if ($factory instanceof GedcomRecordFactoryInterface) { 234 self::$gedcom_record_factory = $factory; 235 } 236 237 return self::$gedcom_record_factory; 238 } 239 240 /** 241 * Store or retrieve a factory object. 242 * 243 * @param HeaderFactoryInterface|null $factory 244 * 245 * @return HeaderFactoryInterface 246 */ 247 public static function headerFactory(HeaderFactoryInterface $factory = null): HeaderFactoryInterface 248 { 249 if ($factory instanceof HeaderFactoryInterface) { 250 self::$header_factory = $factory; 251 } 252 253 return self::$header_factory; 254 } 255 256 /** 257 * Store or retrieve a factory object. 258 * 259 * @param IdFactoryInterface|null $factory 260 * 261 * @return IdFactoryInterface 262 */ 263 public static function idFactory(IdFactoryInterface $factory = null): IdFactoryInterface 264 { 265 if ($factory instanceof IdFactoryInterface) { 266 self::$id_factory = $factory; 267 } 268 269 return self::$id_factory; 270 } 271 272 /** 273 * Store or retrieve a factory object. 274 * 275 * @param ImageFactoryInterface|null $factory 276 * 277 * @return ImageFactoryInterface 278 */ 279 public static function imageFactory(ImageFactoryInterface $factory = null): ImageFactoryInterface 280 { 281 if ($factory instanceof ImageFactoryInterface) { 282 self::$image_factory = $factory; 283 } 284 285 return self::$image_factory; 286 } 287 288 /** 289 * Store or retrieve a factory object. 290 * 291 * @param IndividualFactoryInterface|null $factory 292 * 293 * @return IndividualFactoryInterface 294 */ 295 public static function individualFactory(IndividualFactoryInterface $factory = null): IndividualFactoryInterface 296 { 297 if ($factory instanceof IndividualFactoryInterface) { 298 self::$individual_factory = $factory; 299 } 300 301 return self::$individual_factory; 302 } 303 304 /** 305 * Store or retrieve a factory object. 306 * 307 * @param LocationFactoryInterface|null $factory 308 * 309 * @return LocationFactoryInterface 310 */ 311 public static function locationFactory(LocationFactoryInterface $factory = null): LocationFactoryInterface 312 { 313 if ($factory instanceof LocationFactoryInterface) { 314 self::$location_factory = $factory; 315 } 316 317 return self::$location_factory; 318 } 319 320 /** 321 * Store or retrieve a factory object. 322 * 323 * @param MarkdownFactoryInterface|null $factory 324 * 325 * @return MarkdownFactoryInterface 326 */ 327 public static function markdownFactory(MarkdownFactoryInterface $factory = null): MarkdownFactoryInterface 328 { 329 if ($factory instanceof MarkdownFactoryInterface) { 330 self::$markdown_factory = $factory; 331 } 332 333 return self::$markdown_factory; 334 } 335 336 /** 337 * Store or retrieve a factory object. 338 * 339 * @param MediaFactoryInterface|null $factory 340 * 341 * @return MediaFactoryInterface 342 */ 343 public static function mediaFactory(MediaFactoryInterface $factory = null): MediaFactoryInterface 344 { 345 if ($factory instanceof MediaFactoryInterface) { 346 self::$media_factory = $factory; 347 } 348 349 return self::$media_factory; 350 } 351 352 /** 353 * Store or retrieve a factory object. 354 * 355 * @param NoteFactoryInterface|null $factory 356 * 357 * @return NoteFactoryInterface 358 */ 359 public static function noteFactory(NoteFactoryInterface $factory = null): NoteFactoryInterface 360 { 361 if ($factory instanceof NoteFactoryInterface) { 362 self::$note_factory = $factory; 363 } 364 365 return self::$note_factory; 366 } 367 368 /** 369 * Store or retrieve a factory object. 370 * 371 * @param RepositoryFactoryInterface|null $factory 372 * 373 * @return RepositoryFactoryInterface 374 */ 375 public static function repositoryFactory(RepositoryFactoryInterface $factory = null): RepositoryFactoryInterface 376 { 377 if ($factory instanceof RepositoryFactoryInterface) { 378 self::$repository_factory = $factory; 379 } 380 381 return self::$repository_factory; 382 } 383 384 /** 385 * Store or retrieve a factory object. 386 * 387 * @param ResponseFactoryInterface|null $factory 388 * 389 * @return ResponseFactoryInterface 390 */ 391 public static function responseFactory(ResponseFactoryInterface $factory = null): ResponseFactoryInterface 392 { 393 if ($factory instanceof ResponseFactoryInterface) { 394 self::$response_factory = $factory; 395 } 396 397 return self::$response_factory; 398 } 399 400 /** 401 * Store or retrieve a factory object. 402 * 403 * @param RouteFactoryInterface|null $factory 404 * 405 * @return RouteFactoryInterface 406 */ 407 public static function routeFactory(RouteFactoryInterface $factory = null): RouteFactoryInterface 408 { 409 if ($factory instanceof RouteFactoryInterface) { 410 self::$route_factory = $factory; 411 } 412 413 return self::$route_factory; 414 } 415 416 /** 417 * Store or retrieve a factory object. 418 * 419 * @param SharedNoteFactoryInterface|null $factory 420 * 421 * @return SharedNoteFactoryInterface 422 */ 423 public static function sharedNoteFactory(SharedNoteFactoryInterface $factory = null): SharedNoteFactoryInterface 424 { 425 if ($factory instanceof SharedNoteFactoryInterface) { 426 self::$shared_note_factory = $factory; 427 } 428 429 return self::$shared_note_factory; 430 } 431 432 /** 433 * Store or retrieve a factory object. 434 * 435 * @param SlugFactoryInterface|null $factory 436 * 437 * @return SlugFactoryInterface 438 */ 439 public static function slugFactory(SlugFactoryInterface $factory = null): SlugFactoryInterface 440 { 441 if ($factory instanceof SlugFactoryInterface) { 442 self::$slug_factory = $factory; 443 } 444 445 return self::$slug_factory; 446 } 447 448 /** 449 * Store or retrieve a factory object. 450 * 451 * @param SourceFactoryInterface|null $factory 452 * 453 * @return SourceFactoryInterface 454 */ 455 public static function sourceFactory(SourceFactoryInterface $factory = null): SourceFactoryInterface 456 { 457 if ($factory instanceof SourceFactoryInterface) { 458 self::$source_factory = $factory; 459 } 460 461 return self::$source_factory; 462 } 463 464 /** 465 * Store or retrieve a factory object. 466 * 467 * @param SubmissionFactoryInterface|null $factory 468 * 469 * @return SubmissionFactoryInterface 470 */ 471 public static function submissionFactory(SubmissionFactoryInterface $factory = null): SubmissionFactoryInterface 472 { 473 if ($factory instanceof SubmissionFactoryInterface) { 474 self::$submission_factory = $factory; 475 } 476 477 return self::$submission_factory; 478 } 479 480 /** 481 * Store or retrieve a factory object. 482 * 483 * @param SubmitterFactoryInterface|null $factory 484 * 485 * @return SubmitterFactoryInterface 486 */ 487 public static function submitterFactory(SubmitterFactoryInterface $factory = null): SubmitterFactoryInterface 488 { 489 if ($factory instanceof SubmitterFactoryInterface) { 490 self::$submitter_factory = $factory; 491 } 492 493 return self::$submitter_factory; 494 } 495 496 /** 497 * Store or retrieve a factory object. 498 * 499 * @param SurnameTraditionFactoryInterface|null $factory 500 * 501 * @return SurnameTraditionFactoryInterface 502 */ 503 public static function surnameTraditionFactory(SurnameTraditionFactoryInterface $factory = null): SurnameTraditionFactoryInterface 504 { 505 if ($factory instanceof SurnameTraditionFactoryInterface) { 506 self::$surname_tradition_factory = $factory; 507 } 508 509 return self::$surname_tradition_factory; 510 } 511 512 /** 513 * Store or retrieve a factory object. 514 * 515 * @param TimeFactoryInterface|null $factory 516 * 517 * @return TimeFactoryInterface 518 */ 519 public static function timeFactory(TimeFactoryInterface $factory = null): TimeFactoryInterface 520 { 521 if ($factory instanceof TimeFactoryInterface) { 522 self::$time_factory = $factory; 523 } 524 525 return self::$time_factory; 526 } 527 528 /** 529 * Store or retrieve a factory object. 530 * 531 * @param TimestampFactoryInterface|null $factory 532 * 533 * @return TimestampFactoryInterface 534 */ 535 public static function timestampFactory(TimestampFactoryInterface $factory = null): TimestampFactoryInterface 536 { 537 if ($factory instanceof TimestampFactoryInterface) { 538 self::$timestamp_factory = $factory; 539 } 540 541 return self::$timestamp_factory; 542 } 543 544 /** 545 * Store or retrieve a factory object. 546 * 547 * @param XrefFactoryInterface|null $factory 548 * 549 * @return XrefFactoryInterface 550 */ 551 public static function xrefFactory(XrefFactoryInterface $factory = null): XrefFactoryInterface 552 { 553 if ($factory instanceof XrefFactoryInterface) { 554 self::$xref_factory = $factory; 555 } 556 557 return self::$xref_factory; 558 } 559} 560