4 use Test::More 'no_plan';
11 # =begin testing SETUP
17 has 'balance' => ( isa => 'Int', is => 'rw', default => 0 );
20 my ( $self, $amount ) = @_;
21 $self->balance( $self->balance + $amount );
25 my ( $self, $amount ) = @_;
26 my $current_balance = $self->balance();
27 ( $current_balance >= $amount )
28 || confess "Account overdrawn";
29 $self->balance( $current_balance - $amount );
32 package CheckingAccount;
35 extends 'BankAccount';
37 has 'overdraft_account' => ( isa => 'BankAccount', is => 'rw' );
39 before 'withdraw' => sub {
40 my ( $self, $amount ) = @_;
41 my $overdraft_amount = $amount - $self->balance();
42 if ( $self->overdraft_account && $overdraft_amount > 0 ) {
43 $self->overdraft_account->withdraw($overdraft_amount);
44 $self->deposit($overdraft_amount);
56 $savings_account = BankAccount->new( balance => 250 );
57 isa_ok( $savings_account, 'BankAccount' );
59 is( $savings_account->balance, 250, '... got the right savings balance' );
61 $savings_account->withdraw(50);
63 '... withdrew from savings successfully';
64 is( $savings_account->balance, 200,
65 '... got the right savings balance after withdrawl' );
67 $savings_account->deposit(150);
68 is( $savings_account->balance, 350,
69 '... got the right savings balance after deposit' );
73 my $checking_account = CheckingAccount->new(
75 overdraft_account => $savings_account
77 isa_ok( $checking_account, 'CheckingAccount' );
78 isa_ok( $checking_account, 'BankAccount' );
80 is( $checking_account->overdraft_account, $savings_account,
81 '... got the right overdraft account' );
83 is( $checking_account->balance, 100,
84 '... got the right checkings balance' );
87 $checking_account->withdraw(50);
89 '... withdrew from checking successfully';
90 is( $checking_account->balance, 50,
91 '... got the right checkings balance after withdrawl' );
92 is( $savings_account->balance, 350,
93 '... got the right savings balance after checking withdrawl (no overdraft)'
97 $checking_account->withdraw(200);
99 '... withdrew from checking successfully';
100 is( $checking_account->balance, 0,
101 '... got the right checkings balance after withdrawl' );
102 is( $savings_account->balance, 200,
103 '... got the right savings balance after overdraft withdrawl' );
107 my $checking_account = CheckingAccount->new(
110 # no overdraft account
112 isa_ok( $checking_account, 'CheckingAccount' );
113 isa_ok( $checking_account, 'BankAccount' );
115 is( $checking_account->overdraft_account, undef,
116 '... no overdraft account' );
118 is( $checking_account->balance, 100,
119 '... got the right checkings balance' );
122 $checking_account->withdraw(50);
124 '... withdrew from checking successfully';
125 is( $checking_account->balance, 50,
126 '... got the right checkings balance after withdrawl' );
129 $checking_account->withdraw(200);
131 '... withdrawl failed due to attempted overdraft';
132 is( $checking_account->balance, 50,
133 '... got the right checkings balance after withdrawl failure' );