Class: Gambit::Tools::Currency

Inherits:
Object
  • Object
show all
Includes:
Enumerable, Viewable
Defined in:
lib/gambit/tools/currency.rb

Overview

A general money tool for managing various denominations and the conversions between them.

Constant Summary collapse

@@values =
Hash.new(0)

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Viewable

append_features, #view

Constructor Details

#initialize(initial_holdings = nil) ⇒ Currency

Creates a new Currency object. Optionally, you may provide a Hash of initial_holdings.



75
76
77
78
79
80
81
# File 'lib/gambit/tools/currency.rb', line 75

def initialize( initial_holdings = nil )
  if initial_holdings.is_a? Hash
    @holdings = initial_holdings
  else
    @holdings = Hash.new(0)
  end
end

Instance Attribute Details

#holdingsObject (readonly)

The holdings Hash.



84
85
86
# File 'lib/gambit/tools/currency.rb', line 84

def holdings
  @holdings
end

Class Method Details

.[](resource) ⇒ Object

Fetch a standard ratio for a resource Currency objects can use.



58
59
60
# File 'lib/gambit/tools/currency.rb', line 58

def self.[]( resource )
  return @@values[resource]
end

.[]=(resource, ratio) ⇒ Object

Used to set a standard ratio for a resource Currency objects can use.



51
52
53
# File 'lib/gambit/tools/currency.rb', line 51

def self.[]=( resource, ratio )
  @@values[resource] = ratio.to_f  
end

.relative_value(from_resource, to_resource) ⇒ Object

Calculates a relative_value from_resource to_resource.



63
64
65
66
67
68
69
# File 'lib/gambit/tools/currency.rb', line 63

def self.relative_value( from_resource, to_resource )
  if @@values.key?(from_resource) && @@values.key?(to_resource)
    @@values[from_resource] / @@values[to_resource]
  else
    raise ArgumentError, "Can't find conversion ratio!"
  end
end

Instance Method Details

#+(other_currency) ⇒ Object

Combine holding between this Currency object and other_currency.



117
118
119
120
121
122
123
124
125
126
# File 'lib/gambit/tools/currency.rb', line 117

def +( other_currency )
  new_holdings = Hash.new(0)
  @holdings.each do |key,value|
    new_holdings[key] += value
  end
  other_currency.holdings.each do |key,value|
    new_holdings[key] += value
  end
  return Currency.new(new_holdings)
end

#-(other_currency) ⇒ Object

Remove holdings in other_currency from this Currency object.



129
130
131
132
133
134
135
136
137
138
# File 'lib/gambit/tools/currency.rb', line 129

def -( other_currency )
  new_holdings = Hash.new(0)
  other_currency.holdings.each do |key,value|
    new_holdings[key] = @holdings[key] - value
  end
  if new_holdings.values.min < 0
    raise ArgumentError, "Detected negative value"
  end
  return Currency.new(new_holdings)
end

#[](resource) ⇒ Object

Delegates to the holdings Hash.



87
88
89
# File 'lib/gambit/tools/currency.rb', line 87

def []( resource )
  return @holdings[resource]
end

#deposit(amount, resource) ⇒ Object

Add amount of resource to these holdings.



109
110
111
112
113
114
# File 'lib/gambit/tools/currency.rb', line 109

def deposit( amount, resource )
  if @@values.key?(resource)
    @holdings[resource] += amount
    return amount
  end
end

#each(&block) ⇒ Object

Delegates to the holdings Hash.



143
144
145
# File 'lib/gambit/tools/currency.rb', line 143

def each(&block)
  @holdings.each(&block)
end

#withdraw(amount, resource, as_resource = nil) ⇒ Object

Remove amount of resource from these holdings, optionally as_resource.



95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/gambit/tools/currency.rb', line 95

def withdraw( amount, resource, as_resource = nil )
  if (@holdings[resource] - amount >= 0 && as_resource.nil?)
    @holdings[resource] -= amount
    return amount
  elsif (@holdings[resource] - amount >= 0)
    @holdings[resource] -= amount
    return amount *
           self.class.relative_value(resource, as_resource)
  else
    raise ArgumentError, "Insufficiant Funds"
  end  
end