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