Currency Conversion
===================

To convert a Money instance from one Currency to another, you need the Converter. This class depends on
Currencies and Exchange. Exchange returns a `CurrencyPair`, which is the combination of the base
currency, counter currency and the conversion ratio.


Fixed Exchange
--------------

You can use a fixed exchange to convert `Money` into another Currency.

.. code:: php

    use Money\Converter;
    use Money\Currency;
    use Money\Currencies\ISOCurrencies;
    use Money\Exchange\FixedExchange;

    $exchange = new FixedExchange([
        'EUR' => [
            'USD' => '1.25'
        ]
    ]);

    $converter = new Converter(new ISOCurrencies(), $exchange);

    $eur100 = Money::EUR(100);
    $usd125 = $converter->convert($eur100, new Currency('USD'));


Reversed Currencies Exchange
----------------------------

In some cases you might want the Exchange to resolve the reverse of the Currency Pair
as well if the original cannot be found. To add this behaviour to any Exchange
you need to wrap it in in a `ReversedCurrenciesExchange`. If a reverse Currency Pair
can be found, it's simply used as a divisor of 1 to calculate the reverse
conversion ratio.

For example this can be useful if you use a `FixedExchange` and you don't want to
define the currency pairs in both directions.

.. code:: php

    use Money\Converter;
    use Money\Currency;
    use Money\Currencies\ISOCurrencies;
    use Money\Exchange\FixedExchange;
    use Money\Exchange\ReversedCurrenciesExchange;

    $exchange = new ReversedCurrenciesExchange(new FixedExchange([
        'EUR' => [
            'USD' => '1.25'
        ]
    ]));

    $converter = new Converter(new ISOCurrencies(), $exchange);

    $usd125 = Money::USD(125);
    $eur100 = $converter->convert($usd125, new Currency('EUR'));


Third Party Integrations
------------------------

We also provide a way to integrate external sources of conversion rates by implementing
the ``Money\Exchange`` interface.


Swap
^^^^

Swap_ is a currency exchange library widespread in the PHP ecosystem. You can install it via Composer_:

.. code:: bash

    $ composer require florianv/swap


Then conversion is quite simple:

.. code:: php

    use Money\Money;
    use Money\Converter;
    use Money\Currencies\ISOCurrencies;
    use Money\Exchange\SwapExchange;

    // $swap = Implementation of \Swap\SwapInterface
    $exchange = new SwapExchange($swap);

    $converter = new Converter(new ISOCurrencies(), $exchange);
    $eur100 = Money::EUR(100);
    $usd125 = $converter->convert($eur100, new Currency('USD'));
    [$usd125, $pair] = $converter->convertAndReturnWithCurrencyPair($eur100, new Currency('USD'));


.. _Swap: https://github.com/florianv/swap
.. _Composer: https://getcomposer.org


Exchanger
^^^^^^^^^

Exchanger_ is the currency exchange framework behind Swap_.

.. code:: bash

    $ composer require florianv/exchanger


Then conversion is quite simple:

.. code:: php

    use Money\Money;
    use Money\Converter;
    use Money\Currencies\ISOCurrencies;
    use Money\Exchanger\ExchangerExchange;

    // $exchanger = Implementation of \Exchanger\Contract\ExchangeRateProvider
    $exchange = new ExchangerExchange($exchanger);

    $converter = new Converter(new ISOCurrencies(), $exchange);
    $eur100 = Money::EUR(100);
    $usd125 = $converter->convert($eur100, new Currency('USD'));
    [$usd125, $pair] = $converter->convertAndReturnWithCurrencyPair($eur100, new Currency('USD'));


.. _Exchanger: https://github.com/florianv/exchanger


CurrencyPair
------------

A CurrencyPair is returned by the Exchange. If you want to implement your own Exchange, you can use
the OOP notation to define a pair:

.. code:: php

    use Money\Currency;
    use Money\CurrencyPair;

    $pair = new CurrencyPair(new Currency('EUR'), new Currency('USD'), 1.2500);


But you can also parse ISO notations. For example, the quotation ``EUR/USD 1.2500``
means that one euro is exchanged for 1.2500 US dollars.

.. code:: php

    use Money\CurrencyPair;

    $pair = CurrencyPair::createFromIso('EUR/USD 1.2500');

You could also create a pair using a third party. There is a default one in the core using Swap_
which you can install via Composer_.

.. code:: php

    use Money\Currency;
    use Money\Exchange\SwapExchange;

    $eur = new Currency('EUR');
    $usd = new Currency('USD');

    // $swap = Implementation of \Swap\SwapInterface
    $exchange = new SwapExchange($swap);

    $pair = $exchange->quote($eur, $usd);

A currency pair can be used to convert an amount.

.. code:: php

    use Money\Money;
    use Money\Currency;
    use Money\Currencies\ISOCurrencies;
    use Money\Exchange\SwapExchange;

    // $swap = Implementation of \Swap\SwapInterface
    $exchange = new SwapExchange($swap);

    $converter = new Converter(new ISOCurrencies(), $exchange);
    $eur100 = Money::EUR(100);
    $usd125 = $converter->convertAgainstCurrencyPair($eur100, $pair);
