func checkListener(listener interface{}) (reflect.Type, error) {
    lisVal := reflect.TypeOf(listener)
    if lisVal.Kind() != reflect.Func ||  
        lisVal.NumIn()  != 1 ||  
        lisVal.NumOut() != 0 {   
        return lisVal, ListenerInvalidErr
    }
    return lisVal.In(0), nil
}
Checks if the listener passed is valid.
If valid, returns a reflect.Type object of the listener input argument;
if not valid, returns a ListenerInvalidErr and a reflect.Type of the listener passed.
package gobus
import "reflect"
func (s *Subscription) GetListeners(typ reflect.Type) (IListenerSet, error) {
    val, ok := (*s)[typ.String()]
    if !ok {
        return nil, ListenersNotFoundErr
    }
    return val, nil
}
func (s *Subscription) AddListener(listener interface{}) (*Subscription) {
    content, err := checkListener(listener)
    if err != nil {
        panic(err)
    }
    val, ok := (*s)[content.String()]
    if !ok {
        (*s)[content.String()] = &ListenerSet{
            listeners: []interface{}{listener},
        }
    } else {
        val.Add(listener)
    }
    return s
}
func (s *Subscription) RemoveListener(listener interface{}) (*Subscription) {
    content, err := checkListener(listener)
    if err != nil {
        panic(err)
    }
    val, ok := (*s)[content.String()]
    if ok {
        val.Remove(listener)
    }
    return s
}