class GetAsyncOperationPlugin implements IPlugin {

    @Override
    public void load() throws PluginException {
        try {
            IBootstrapItem<String> item = new BootstrapItem("CreateGetAsyncOperationActor");

            item
//                    .after("IOC")
//                    .before("starter")
                    .process(() -> {
                        try {
                            IKey actorKey = Keys.getOrAdd(GetAsyncOperationActor.class.getCanonicalName());
                            IOC.register(actorKey, new ApplyFunctionToArgumentsStrategy(
                                    (args) -> {
                                        try {
                                            return new GetAsyncOperationActor((IObject) args[0]);
                                        } catch (GetAsyncOperationActorException e) {
                                            throw new RuntimeException("Can't create GetAsyncOperationActor with params: " + Arrays.toString(args), e);
                                        }
                                    }
                            ));
                        } catch (ResolutionException e) {
                            throw new ActionExecuteException("GetAsyncOperationActor plugin can't load: can't get GetAsyncOperationActor key", e);
                        } catch (InvalidArgumentException e) {
                            throw new ActionExecuteException("GetAsyncOperationActor plugin can't load: can't create strategy", e);
                        } catch (RegistrationException e) {
                            throw new ActionExecuteException("GetAsyncOperationActor plugin can't load: can't register new strategy", e);
                        }
                    });
            bootstrap.add(item);
        } catch (Exception e) {
            throw new PluginException("Can't load GetAsyncOperationPlugin", e);
        }

    }

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

}