001/*
002  Copyright (c) 2012, 2014, Credit Suisse (Anatole Tresch), Werner Keil and others by the @author tag.
003
004  Licensed under the Apache License, Version 2.0 (the "License"); you may not
005  use this file except in compliance with the License. You may obtain a copy of
006  the License at
007
008  http://www.apache.org/licenses/LICENSE-2.0
009
010  Unless required by applicable law or agreed to in writing, software
011  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013  License for the specific language governing permissions and limitations under
014  the License.
015 */
016package org.javamoney.moneta.function;
017
018import java.util.Objects;
019
020import javax.money.CurrencyUnit;
021import javax.money.Monetary;
022import javax.money.MonetaryAmount;
023import javax.money.MonetaryOperator;
024
025import org.javamoney.moneta.RoundedMoney;
026
027/**
028 * The implementation of {@link MonetaryAmountProducer} that creates {@link MonetaryAmount}
029 * using {@link RoundedMoney} using the {@link MonetaryOperator} as rounding operator
030 * @see RoundedMoneyProducer#RoundedMoneyProducer(MonetaryOperator)
031 * @author Otavio Santana
032 */
033public final class RoundedMoneyProducer implements MonetaryAmountProducer {
034
035        private final MonetaryOperator operator;
036
037        /**
038         * Creates this producer using this operator
039         * as rounding operator in all MonetaryAmount produced.
040         * @param operator the rounnding implementation, not null.
041         * @throws NullPointerException if operator is null
042         */
043        public RoundedMoneyProducer(MonetaryOperator operator) {
044                this.operator = Objects.requireNonNull(operator);
045        }
046
047        /**
048         * Returns the {@link MonetaryAmountProducer} that creates {@link MonetaryAmount}
049         * using the {@link RoundedMoney} implementation using {@link MonetaryOperators#rounding()}.
050         * as rounding operator
051         * @see RoundedMoneyProducer
052         */
053        public RoundedMoneyProducer() {
054                this.operator = MonetaryOperators.rounding();
055        }
056
057        @Override
058        public MonetaryAmount create(CurrencyUnit currency, Number number) {
059                return RoundedMoney.of(Objects.requireNonNull(number), Objects.requireNonNull(currency), operator);
060        }
061
062        public MonetaryOperator getOperator() {
063                return operator;
064        }
065
066}