Completed
Push — milestone/2_0/react-ui ( 5b168c...b737dc )
by
unknown
04:15
created

Emitter::get_events()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 4
nc 1
nop 0
dl 0
loc 5
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
namespace Carbon_Fields\Event;
4
5
class Emitter {
6
7
	protected $listeners = array();
8
9
	/**
10
	 * Broadcast an event
11
	 * 
12
	 * @return mixed
13
	 */
14
	public function emit() {
15
		$args = func_get_args();
16
		$event = $args[0];
17
		$args = array_slice( $args, 1 );
18
19
		$listeners = $this->get_listeners( $event );
20
		foreach ( $listeners as $listener ) {
21
			if ( $listener->is_valid() ) {
22
				call_user_func_array( array( $listener, 'notify' ), $args );
23
			}
24
		}
25
26
		$this->remove_invalid_listeners( $event );
27
	}
28
29
	/**
30
	 * Get array of events with registered listeners
31
	 * 
32
	 * @return array<string>
33
	 */
34
	protected function get_events() {
35
		$events_with_listeners = array_filter( $this->listeners );
1 ignored issue
show
Comprehensibility Naming introduced by
The variable name $events_with_listeners exceeds the maximum configured length of 20.

Very long variable names usually make code harder to read. It is therefore recommended not to make variable names too verbose.

Loading history...
36
		$events = array_keys( $events_with_listeners );
37
		return $events;
38
	}
39
40
	/**
41
	 * Get array of listenrs for a specific event
42
	 * 
43
	 * @param  string          $event Event to get listeners for
44
	 * @return array<Listener>
45
	 */
46
	protected function get_listeners( $event ) {
47
		$listeners = isset( $this->listeners[ $event ] ) ? $this->listeners[ $event ] : array();
48
		return $listeners;
49
	}
50
51
	/**
52
	 * Remove invalid listeners from an event
53
	 * 
54
	 * @param string $event
55
	 */
56
	protected function remove_invalid_listeners( $event ) {
57
		$listeners = $this->get_listeners( $event );
58
		if ( empty( $listeners ) ) {
59
			return;
60
		}
61
62
		$this->listeners[ $event ] = array_filter( $listeners, function( $listener ) {
63
			return $listener->is_valid();
64
		} );
65
	}
66
67
	/**
68
	 * Add a listener to an event
69
	 * 
70
	 * @param string   $event
71
	 * @return Listener $listener
72
	 */
73
	public function add_listener( $event, $listener ) {
74
		if ( ! isset( $this->listeners[ $event ] ) ) {
75
			$this->listeners[ $event ] = array();
76
		}
77
		$this->listeners[ $event ][] = $listener;
78
		return $listener;
79
	}
80
81
	/**
82
	 * Remove a listener from any event
83
	 * 
84
	 * @param Listener $removed_listener
85
	 */
86
	public function remove_listener( $removed_listener ) {
87
		$events = $this->get_events();
88
		foreach ( $events as $event ) {
89
			$listeners = $this->get_listeners( $event );
90
			$filtered_listeners = array_filter( $listeners, function( $listener ) use ( $removed_listener ) {
91
				return ( $listener !== $removed_listener );
92
			} );
93
			$this->listeners[ $event ] = $filtered_listeners;
94
		}
95
	}
96
97
	/**
98
	 * Add a persistent listener to an event
99
	 * 
100
	 * @param  string   $event    The event to listen for
101
	 * @param  string   $callable The callable to call when the event is broadcasted
102
	 * @return Listener
103
	 */
104
	public function on( $event, $callable ) {
1 ignored issue
show
Coding Style introduced by
This method's name is shorter than the configured minimum length of 3 characters.

Even though PHP does not care about the name of your methods, it is generally a good practice to choose method names which can be easily understood by other human readers.

Loading history...
105
		$listener = \Carbon_Fields\Carbon_Fields::resolve( 'event_persistent_listener' );
106
		$listener->set_callable( $callable );
107
		return $this->add_listener( $event, $listener );
108
	}
109
110
	/**
111
	 * Add a one-time listener to an event
112
	 *
113
	 * @param  string   $event    The event to listen for
114
	 * @param  string   $callable The callable to call when the event is broadcasted
115
	 * @return Listener
116
	 */
117
	public function once( $event, $callable ) {
118
		$listener = \Carbon_Fields\Carbon_Fields::resolve( 'event_single_event_listener' );
119
		$listener->set_callable( $callable );
120
		return $this->add_listener( $event, $listener );
121
	}
122
}