@Override
    public Collection<Coin> payback() {
        // 金額の高い順にコインを1種類ずつ保持
        ImmutableSortedSet<Coin> coinSet = ImmutableSortedSet.copyOf( //
            Coins.descComparator(), //
            Coins.getOneOfEach() //
            );
        Collection<Coin> payback = Lists.newArrayList();

        Yen remain = this.coinPool.getTotalAmount();
        for ( Coin coin : coinSet) {
            while ( remain.compareTo( coin.getAmount()) >= 0) {
                remain = remain.subtract( coin.getAmount());

                if ( remain.compareTo( Yen.zero()) < 0) {
                    throw new AssertionError();
                }

                payback.add( coin);

                if ( remain.compareTo( Yen.zero()) == 0) {
                    this.coinPool.clear();
                    this.io.writeln( this.formatPayback( payback));
                    return payback;
                }
            }
        }

        // おつりなし
        this.io.writeln( Message.NO_PAYBACK_COINS);
        return Collections.emptyList();
    }