protected BusMatcher bindBus( final String identifier )
    {
        checkArgument( identifier != null, "Event bus identifier must be not null" );

        return new BusMatcher()
        {

            public void toAnyBoundClass()
            {
                to( any() );
            }

            public void to( Matcher<Object> matcher )
            {
                checkArgument( matcher != null, "Event bus matcher must be not null" );

                final EventBus eventBus = new EventBus( identifier );

                bind( EventBus.class ).annotatedWith( named( identifier ) ).toInstance( eventBus );

                bindListener( matcher, new TypeListener()
                {
                    public <I> void hear( TypeLiteral<I> typeLiteral, TypeEncounter<I> typeEncounter )
                    {
                        typeEncounter.register( new InjectionListener<I>()
                        {
                            public void afterInjection( I injectee )
                            {
                                eventBus.register( injectee );
                            }
                        } );
                    }
                } );
            }

        };
    }