summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/SemanticMediaWiki/src/EventHandler.php
blob: b0bdfa55472738908fcb1a2dfb33f4d529c39afb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
<?php

namespace SMW;

use Onoi\EventDispatcher\EventDispatcher;
use Onoi\EventDispatcher\EventDispatcherFactory;

/**
 * @license GNU GPL v2+
 * @since 2.2
 *
 * @author mwjames
 */
class EventHandler {

	/**
	 * @var EventHandler
	 */
	private static $instance = null;

	/**
	 * @var EventDispatcher
	 */
	private $eventDispatcher = null;

	/**
	 * @since 2.2
	 *
	 * @param EventDispatcher $eventDispatcher
	 */
	public function __construct( EventDispatcher $eventDispatcher ) {
		$this->eventDispatcher = $eventDispatcher;
	}

	/**
	 * @since 2.2
	 *
	 * @return self
	 */
	public static function getInstance() {

		if ( self::$instance === null ) {
			self::$instance = new self( self::newEventDispatcher() );
		}

		return self::$instance;
	}

	/**
	 * @since 2.2
	 */
	public static function clear() {
		self::$instance = null;
	}

	/**
	 * @since 2.2
	 *
	 * @return EventDispatcher
	 */
	public function getEventDispatcher() {
		return $this->eventDispatcher;
	}

	/**
	 * @since 2.2
	 *
	 * @return DispatchContext
	 */
	public function newDispatchContext() {
		return EventDispatcherFactory::getInstance()->newDispatchContext();
	}

	/**
	 * @since 2.3
	 *
	 * @param string $event
	 * @param Closure $callback
	 */
	public function addCallbackListener( $event, \Closure $callback ) {

		$listener = EventDispatcherFactory::getInstance()->newGenericCallbackEventListener();
		$listener->registerCallback( $callback );

		$this->getEventDispatcher()->addListener(
			$event,
			$listener
		);
	}

	private static function newEventDispatcher() {

		$eventListenerRegistry = new EventListenerRegistry(
			EventDispatcherFactory::getInstance()->newGenericEventListenerCollection()
		);

		$eventDispatcher = EventDispatcherFactory::getInstance()->newGenericEventDispatcher();
		$eventDispatcher->addListenerCollection( $eventListenerRegistry );

		return $eventDispatcher;
	}

}