Add subtype inclusion for event handlers
This commit is contained in:
@ -36,6 +36,13 @@ public @interface Event {
|
||||
*/
|
||||
int priority() default 100;
|
||||
|
||||
/**
|
||||
* Defines whether instances of subtypes of the event type are dispatched to the event handler.
|
||||
*
|
||||
* @since 0.0.4
|
||||
*/
|
||||
boolean includeSubtypes() default false;
|
||||
|
||||
/**
|
||||
* Defines the event type the handler listens to. If this value is set, the handler is not
|
||||
* allowed to declare parameters.
|
||||
|
@ -31,7 +31,7 @@ public final class EventBus {
|
||||
return singletonInstance;
|
||||
}
|
||||
|
||||
private final Map<Class<? extends IEvent>, Collection<EventHandler>> bindings
|
||||
private final Map<Class<? extends IEvent>, TreeSet<EventHandler>> bindings
|
||||
= new ConcurrentHashMap<>();
|
||||
private final Set<EventListener> registeredListeners = ConcurrentHashMap.newKeySet();
|
||||
|
||||
@ -55,8 +55,20 @@ public final class EventBus {
|
||||
* @since 0.0.1
|
||||
*/
|
||||
private List<EventHandler> getHandlersFor(Class<? extends IEvent> eventClass) {
|
||||
return bindings.containsKey(eventClass) ? new ArrayList<>(bindings.get(eventClass))
|
||||
: new ArrayList<>();
|
||||
|
||||
// Get handlers defined for the event class
|
||||
Set<EventHandler> handlers
|
||||
= bindings.containsKey(eventClass) ? bindings.get(eventClass)
|
||||
: new TreeSet<>();
|
||||
|
||||
// Get subtype handlers
|
||||
for (var binding : bindings.entrySet())
|
||||
if (binding.getKey().isAssignableFrom(eventClass))
|
||||
for (var handler : binding.getValue())
|
||||
if (handler.includeSubtypes())
|
||||
handlers.add(handler);
|
||||
|
||||
return new ArrayList<>(handlers);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -117,6 +117,12 @@ final class EventHandler implements Comparable<EventHandler> {
|
||||
*/
|
||||
int getPriority() { return annotation.priority(); }
|
||||
|
||||
/**
|
||||
* @return whether this handler includes subtypes
|
||||
* @since 0.0.4
|
||||
*/
|
||||
boolean includeSubtypes() { return annotation.includeSubtypes(); }
|
||||
|
||||
/**
|
||||
* @return the event type this handler listens to
|
||||
* @since 0.0.3
|
||||
|
Reference in New Issue
Block a user