public <ObjectType> ObjectType bindAll( final ObjectType object ) {

            Class cl = object.getClass();

            for ( final Method method : cl.getMethods() ) {
                Listener annotation = method.getAnnotation( Listener.class );
                if ( annotation != null ) {
                    if ( method.getParameterTypes().length != 1 ) {
                        throw new ListenerTypeMismatch( method, eventClass );
                    }
                    Class<?> type = annotation.on();
                    if ( type.equals( Object.class )) {
                        type = method.getParameterTypes()[0];
                    }
                    if ( !eventClass.isAssignableFrom( type )) {
                        if ( annotation.strict() )
                            throw new ListenerTypeMismatch( method, eventClass );
                        else
                            continue;
                    }

                    //noinspection unchecked
                    getListeners().add( new ObjectListenerWrapper<Event>( (Class<Event>) type, new IListener<Event>() {
                        public void handle( Event event ) {
                            try {
                                method.invoke( object, event );
                            } catch ( Exception e ) {
                                throw new RuntimeException( "Exception in Event Handler", e );
                            }
                        }
                    }, object ));
                }
            }

            return object;
        }