lib/money/bank/base.rb in money-3.6.1 vs lib/money/bank/base.rb in money-3.6.2

- old
+ new

@@ -1,131 +1,131 @@ -require 'thread' - -class Money - # Provides classes that aid in the ability of exchange one currency with - # another. - module Bank - - # The lowest Money::Bank error class. - # All Money::Bank errors should inherit from it. - class Error < StandardError - end - - # Raised when the bank doesn't know about the conversion rate - # for specified currencies. - class UnknownRate < Error - end - - - # Money::Bank::Base is the basic interface for creating a money exchange - # object, also called Bank. - # - # A Bank is responsible for storing exchange rates, take a Money object as - # input and returns the corresponding Money object converted into an other - # currency. - # - # This class exists for aiding in the creating of other classes to exchange - # money between different currencies. When creating a subclass you will - # need to implement the following methods to exchange money between - # currencies: - # - # - #exchange_with(Money) #=> Money - # - # See Money::Bank::VariableExchange for a real example. - # - # Also, you can extend +Money::Bank::VariableExchange+ instead of - # +Money::Bank::Base+ if your bank implementation needs to store rates - # internally. - # - # @abstract Subclass and override +#exchange_with+ to implement a custom - # +Money::Bank+ class. You can also override +#setup+ instead of - # +#initialize+ to setup initial variables, etc. - class Base - - # Returns the singleton instance of the Base bank. - # - # @return [Money::Bank::Base] - def self.instance - @@singleton ||= self.new - end - - # The rounding method to use when exchanging rates. - # - # @return [Proc] - attr_reader :rounding_method - - # Initializes a new +Money::Bank::Base+ object. An optional block can be - # passed to dictate the rounding method that +#exchange_with+ can use. - # - # @yield [n] Optional block to use when rounding after exchanging one - # currency for another. - # @yieldparam [Float] n The resulting float after exchanging one currency - # for another. - # @yieldreturn [Integer] - # - # @return [Money::Bank::Base] - # - # @example - # Money::Bank::Base.new #=> #<Money::Bank::Base @rounding_method=nil> - # Money::Bank::Base.new {|n| - # n.floor - # } #=> #<Money::Bank::Base @round_method=#<Proc>> - def initialize(&block) - @rounding_method = block - setup - end - - # Called after initialize. Subclasses can use this method to setup - # variables, etc that they normally would in +#initialize+. - # - # @abstract Subclass and override +#setup+ to implement a custom - # +Money::Bank+ class. - # - # @return [self] - def setup - end - - # Exchanges the given +Money+ object to a new +Money+ object in - # +to_currency+. - # - # @abstract Subclass and override +#exchange_with+ to implement a custom - # +Money::Bank+ class. - # - # @raise NotImplementedError - # - # @param [Money] from The +Money+ object to exchange from. - # @param [Money::Currency, String, Symbol] to_currency The currency - # string or object to exchange to. - # @yield [n] Optional block to use to round the result after making - # the exchange. - # @yieldparam [Float] n The result after exchanging from one currency to - # the other. - # @yieldreturn [Integer] - # - # @return [Money] - def exchange_with(from, to_currency, &block) - raise NotImplementedError, "#exchange_with must be implemented" - end - - - # Given two currency strings or object, checks whether they're both the - # same currency. Return +true+ if the currencies are the same, +false+ - # otherwise. - # - # @param [Money::Currency, String, Symbol] currency1 The first currency - # to compare. - # @param [Money::Currency, String, Symbol] currency2 The second currency - # to compare. - # - # @return [Boolean] - # - # @example - # same_currency?("usd", "USD") #=> true - # same_currency?("usd", "EUR") #=> false - # same_currency?("usd", Currency.new("USD") #=> true - # same_currency?("usd", "USD") #=> true - def same_currency?(currency1, currency2) - Currency.wrap(currency1) == Currency.wrap(currency2) - end - end - end -end +require 'thread' + +class Money + # Provides classes that aid in the ability of exchange one currency with + # another. + module Bank + + # The lowest Money::Bank error class. + # All Money::Bank errors should inherit from it. + class Error < StandardError + end + + # Raised when the bank doesn't know about the conversion rate + # for specified currencies. + class UnknownRate < Error + end + + + # Money::Bank::Base is the basic interface for creating a money exchange + # object, also called Bank. + # + # A Bank is responsible for storing exchange rates, take a Money object as + # input and returns the corresponding Money object converted into an other + # currency. + # + # This class exists for aiding in the creating of other classes to exchange + # money between different currencies. When creating a subclass you will + # need to implement the following methods to exchange money between + # currencies: + # + # - #exchange_with(Money) #=> Money + # + # See Money::Bank::VariableExchange for a real example. + # + # Also, you can extend +Money::Bank::VariableExchange+ instead of + # +Money::Bank::Base+ if your bank implementation needs to store rates + # internally. + # + # @abstract Subclass and override +#exchange_with+ to implement a custom + # +Money::Bank+ class. You can also override +#setup+ instead of + # +#initialize+ to setup initial variables, etc. + class Base + + # Returns the singleton instance of the Base bank. + # + # @return [Money::Bank::Base] + def self.instance + @@singleton ||= self.new + end + + # The rounding method to use when exchanging rates. + # + # @return [Proc] + attr_reader :rounding_method + + # Initializes a new +Money::Bank::Base+ object. An optional block can be + # passed to dictate the rounding method that +#exchange_with+ can use. + # + # @yield [n] Optional block to use when rounding after exchanging one + # currency for another. + # @yieldparam [Float] n The resulting float after exchanging one currency + # for another. + # @yieldreturn [Integer] + # + # @return [Money::Bank::Base] + # + # @example + # Money::Bank::Base.new #=> #<Money::Bank::Base @rounding_method=nil> + # Money::Bank::Base.new {|n| + # n.floor + # } #=> #<Money::Bank::Base @round_method=#<Proc>> + def initialize(&block) + @rounding_method = block + setup + end + + # Called after initialize. Subclasses can use this method to setup + # variables, etc that they normally would in +#initialize+. + # + # @abstract Subclass and override +#setup+ to implement a custom + # +Money::Bank+ class. + # + # @return [self] + def setup + end + + # Exchanges the given +Money+ object to a new +Money+ object in + # +to_currency+. + # + # @abstract Subclass and override +#exchange_with+ to implement a custom + # +Money::Bank+ class. + # + # @raise NotImplementedError + # + # @param [Money] from The +Money+ object to exchange from. + # @param [Money::Currency, String, Symbol] to_currency The currency + # string or object to exchange to. + # @yield [n] Optional block to use to round the result after making + # the exchange. + # @yieldparam [Float] n The result after exchanging from one currency to + # the other. + # @yieldreturn [Integer] + # + # @return [Money] + def exchange_with(from, to_currency, &block) + raise NotImplementedError, "#exchange_with must be implemented" + end + + + # Given two currency strings or object, checks whether they're both the + # same currency. Return +true+ if the currencies are the same, +false+ + # otherwise. + # + # @param [Money::Currency, String, Symbol] currency1 The first currency + # to compare. + # @param [Money::Currency, String, Symbol] currency2 The second currency + # to compare. + # + # @return [Boolean] + # + # @example + # same_currency?("usd", "USD") #=> true + # same_currency?("usd", "EUR") #=> false + # same_currency?("usd", Currency.new("USD") #=> true + # same_currency?("usd", "USD") #=> true + def same_currency?(currency1, currency2) + Currency.wrap(currency1) == Currency.wrap(currency2) + end + end + end +end