public static void main(String[] args) {
        for (Storage storage : storages.values()) {
            try {
                storage.load();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        printHelp();

        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            if (line.length() > 0 && line.charAt(0) == '-') {
                String[] parts = line.substring(1).split(" ");
                String commandName = parts[0];

                if (commandName.equals("exit")) {
                    break;
                } else if (commandName.equals("help")) {
                    printHelp();
                    continue;
                }

                try {
                    storages.get(parts[1]).getClass().getMethod(commandName, String.class).invoke(storages.get(parts[1]), joinArray(parts, " ", 2));
                } catch (Exception me) {
                    // In case of argument-method calling fail
                    try {
                        storages.get(parts[1]).getClass().getMethod(commandName).invoke(storages.get(parts[1]));
                        storages.get(parts[1]).save();
                    } catch (Exception e) {
                        System.out.println("An error occurred. Perhaps, you've made a typo in the method name or specified not all arguments. Try again, anyway!");
                        //e.printStackTrace();
                    }
                }
            }
        }
    }