Appendix D. Account Example in Ruby

This rendition comes from Steen Lehmann.

require 'osx/cocoa'

#!/usr/bin/env ruby
# Lean Architecture example in Ruby -
# with ContextAccessor

# Module that can be mixed in to any class
# that needs access to the current context. It is
# implemented as a thread-local variable.

module ContextAccessor
  def context
    Thread.current[:context]
  end

  def context=(ctx)
    Thread.current[:context] = ctx
  end

  def execute_in_context
    old_context = self.context
    self.context = self
    yield
    self.context = old_context
  end
end
#
# This is the base class (common code) for all
# Account domain classes.
#

class Account
  attr_reader :account_id, :balance

  def initialize(account_id)
    @account_id = account_id
    @balance = 0
  end

  def decreaseBalance(amount)
    raise "Bad argument to withdraw" if amount < 0
    raise "Insufficient funds" if amount > balance
    @balance -= amount
  end

  def increaseBalance(amount)
    @balance += amount
  end

  def update_log(msg, date, amount)
    puts "Account: #{inspect}, #{msg}, \ #{date.to_s},
       #{amount}"
  end

  def self.find(account_id)
    @@store ||= Hash.new
    return @@store[account_id] if @@store.has_key?
          account_id

    if :savings == account_id
      account = SavingsAccount.new(account_id)
      account.increaseBalance(100000)
    elsif :checking == account_id
      account = CheckingAccount.new(account_id)
    else
      account = Account.new(account_id)
    end
    @@store[account_id] = account
    account
  end
end
# This module is the methodless role type. Since # we don't really use types to declare identifiers, # it's kind ...

Get Lean Architecture for Agile Software Development now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.