+ foreach ( $hook_array[$event] as $index => $hook ) {
+ $object = null;
+ $method = null;
+ $func = null;
+ $data = null;
+ $have_data = false;
+ $closure = false;
+ $badhookmsg = false;
+
+ /**
+ * $hook can be: a function, an object, an array of $function and
+ * $data, an array of just a function, an array of object and
+ * method, or an array of object, method, and data.
+ */
+ if ( is_array( $hook ) ) {
+ if ( count( $hook ) < 1 ) {
+ throw new MWException( 'Empty array in hooks for ' . $event . "\n" );
+ } elseif ( is_object( $hook[0] ) ) {
+ $object = $hook_array[$event][$index][0];
+ if ( $object instanceof Closure ) {
+ $closure = true;
+ if ( count( $hook ) > 1 ) {
+ $data = $hook[1];
+ $have_data = true;
+ }
+ } else {
+ if ( count( $hook ) < 2 ) {
+ $method = 'on' . $event;
+ } else {
+ $method = $hook[1];
+ if ( count( $hook ) > 2 ) {
+ $data = $hook[2];
+ $have_data = true;
+ }
+ }
+ }
+ } elseif ( is_string( $hook[0] ) ) {
+ $func = $hook[0];
+ if ( count( $hook ) > 1) {
+ $data = $hook[1];
+ $have_data = true;
+ }
+ } else {
+ throw new MWException( 'Unknown datatype in hooks for ' . $event . "\n" );
+ }
+ } elseif ( is_string( $hook ) ) { # functions look like strings, too
+ $func = $hook;
+ } elseif ( is_object( $hook ) ) {
+ $object = $hook_array[$event][$index];
+ if ( $object instanceof Closure ) {
+ $closure = true;
+ } else {
+ $method = "on" . $event;
+ }
+ } else {
+ throw new MWException( 'Unknown datatype in hooks for ' . $event . "\n" );
+ }
+
+ /* We put the first data element on, if needed. */
+ if ( $have_data ) {
+ $hook_args = array_merge( array( $data ), $args );
+ } else {
+ $hook_args = $args;
+ }