1 <?php
2 /**
3 * @package Joomla.Platform
4 * @subpackage Observer
5 *
6 * @copyright Copyright (C) 2005 - 2017 Open Source Matters, Inc. All rights reserved.
7 * @license GNU General Public License version 2 or later; see LICENSE
8 */
9
10 defined('JPATH_PLATFORM') or die;
11
12 /**
13 * Observer mapping pattern implementation for Joomla
14 *
15 * @since 3.1.2
16 */
17 class JObserverMapper
18 {
19 /**
20 * Array: array( JObservableInterface_classname => array( JObserverInterface_classname => array( paramname => param, .... ) ) )
21 *
22 * @var array
23 * @since 3.1.2
24 */
25 protected static $observations = array();
26
27 /**
28 * Adds a mapping to observe $observerClass subjects with $observableClass observer/listener, attaching it on creation with $params
29 * on $observableClass instance creations
30 *
31 * @param string $observerClass The name of the observer class (implementing JObserverInterface)
32 * @param string $observableClass The name of the observable class (implementing JObservableInterface)
33 * @param array|boolean $params The params to give to the JObserverInterface::createObserver() function, or false to remove mapping
34 *
35 * @return void
36 *
37 * @since 3.1.2
38 */
39 public static function addObserverClassToClass($observerClass, $observableClass, $params = array())
40 {
41 if ($params !== false)
42 {
43 static::$observations[$observableClass][$observerClass] = $params;
44 }
45 else
46 {
47 unset(static::$observations[$observableClass][$observerClass]);
48 }
49 }
50
51 /**
52 * Attaches all applicable observers to an $observableObject
53 *
54 * @param JObservableInterface $observableObject The observable subject object
55 *
56 * @return void
57 *
58 * @since 3.1.2
59 */
60 public static function attachAllObservers(JObservableInterface $observableObject)
61 {
62 $observableClass = get_class($observableObject);
63
64 while ($observableClass != false)
65 {
66 // Attach applicable Observers for the class to the Observable subject:
67 if (isset(static::$observations[$observableClass]))
68 {
69 foreach (static::$observations[$observableClass] as $observerClass => $params)
70 {
71 // Attach an Observer to the Observable subject:
72 /**
73 * @var JObserverInterface $observerClass
74 */
75 $observerClass::createObserver($observableObject, $params);
76 }
77 }
78
79 // Get parent class name (or false if none), and redo the above on it:
80 $observableClass = get_parent_class($observableClass);
81 }
82 }
83 }
84