class GetAsyncOperationTask implements IDatabaseTask {

    @Override
    public void prepare(final IObject query) throws TaskPrepareException {
        try {
            IObject queryForNestedTask  = IOC.resolve(Keys.getOrAdd("info.smart_tools.smartactors.iobject.iobject.IObject"));
            IObject filterObject = IOC.resolve(Keys.getOrAdd("info.smart_tools.smartactors.iobject.iobject.IObject"));

            String token = tokenField.in(query);

            IObject eqKeyObject = IOC.resolve(Keys.getOrAdd("info.smart_tools.smartactors.iobject.iobject.IObject"));
            equalsField.out(eqKeyObject, token);
            tokenField.out(filterObject, eqKeyObject);

            filterField.out(queryForNestedTask, filterObject);


            getItemTask = IOC.resolve(
                    Keys.getOrAdd("db.collection.search"),
                    connection,
                    collectionNameField.in(query),
                    queryForNestedTask,
                    callbackField.in(query)
            );
        } catch (ResolutionException e) {
            throw new TaskPrepareException("Can't create ISearchQuery from input query", e);
        } catch (ReadValueException | ChangeValueException | InvalidArgumentException e) {
            throw new TaskPrepareException("Can't change value in one of IObjects", e);
        }
    }

    public  GetAsyncOperationTask(final IStorageConnection connection);

}