class ActorReceiverCreatorPlugin implements IPlugin {

    @Override
    public void load()
            throws PluginException {
        try {
            IBootstrapItem<String> item = new BootstrapItem("ActorReceiverCreator");
            item
                    .after("IOC")
                    .before("starter")
                    .after("InitializeReceiverGenerator")
                    .after("InitializeWrapperGenerator")
                    .after("IFieldPlugin")
                    .after("IFieldNamePlugin")
                    .process(
                            () -> {
                                try {
                                    IOC.register(
                                            Keys.getOrAdd("actor_receiver_queue"),
                                            new CreateNewInstanceStrategy(args -> new ConcurrentLinkedQueue()));

                                    IOC.register(
                                            Keys.getOrAdd("actor_receiver_busyness_flag"),
                                            new CreateNewInstanceStrategy(args -> new AtomicBoolean(false)));

                                    ActorReceiverCreator objectCreator = new ActorReceiverCreator();
                                    IOC.register(
                                            IOC.resolve(
                                                    IOC.getKeyForKeyStorage(),
                                                    IRoutedObjectCreator.class.getCanonicalName() + "#actor"
                                            ),
                                            new SingletonStrategy(objectCreator)
                                    );
                                } catch (ResolutionException e) {
                                    throw new ActionExecuteException("ActorReceiverCreator plugin can't load: can't get ActorReceiverCreator key", e);
                                } catch (InvalidArgumentException e) {
                                    throw new ActionExecuteException("ActorReceiverCreator plugin can't load: can't create strategy", e);
                                } catch (RegistrationException e) {
                                    throw new ActionExecuteException("ActorReceiverCreator plugin can't load: can't register new strategy", e);
                                } catch (ObjectCreationException e) {
                                    throw new ActionExecuteException("ActorReceiverCreator plugin can't load: constructor error", e);
                                }
                            }
                    );
            this.bootstrap.add(item);
        } catch (Throwable e) {
            throw new PluginException("Could not load 'ActorReceiverCreator plugin'", e);
        }
    }

    public  ActorReceiverCreatorPlugin(final IBootstrap<IBootstrapItem<String>> bootstrap);

}