Spell withdrawal correctly
[gitmo/Class-MOP.git] / t / 017_add_method_modifier.t
CommitLineData
ddc8edba 1use strict;
2use warnings;
3
cc6c0b0b 4use Test::More tests => 20;
ddc8edba 5use Test::Exception;
6
efd3d14c 7use Class::MOP;
ddc8edba 8
9{
69b95026 10
ddc8edba 11 package BankAccount;
69b95026 12
ddc8edba 13 use strict;
14 use warnings;
15 use metaclass;
69b95026 16
ddc8edba 17 use Carp 'confess';
69b95026 18
19 BankAccount->meta->add_attribute(
20 'balance' => (
21 accessor => 'balance',
22 init_arg => 'balance',
23 default => 0
24 )
25 );
26
ddc8edba 27 sub new { (shift)->meta->new_object(@_) }
96ceced8 28
ddc8edba 29 sub deposit {
69b95026 30 my ( $self, $amount ) = @_;
31 $self->balance( $self->balance + $amount );
ddc8edba 32 }
69b95026 33
ddc8edba 34 sub withdraw {
69b95026 35 my ( $self, $amount ) = @_;
a4258ffd 36 my $current_balance = $self->balance();
69b95026 37 ( $current_balance >= $amount )
ddc8edba 38 || confess "Account overdrawn";
69b95026 39 $self->balance( $current_balance - $amount );
ddc8edba 40 }
41
69b95026 42 package CheckingAccount;
ddc8edba 43
69b95026 44 use strict;
45 use warnings;
46 use metaclass;
47
48 use base 'BankAccount';
49
50 CheckingAccount->meta->add_attribute(
51 'overdraft_account' => (
52 accessor => 'overdraft_account',
53 init_arg => 'overdraft',
54 )
55 );
56
57 CheckingAccount->meta->add_before_method_modifier(
58 'withdraw' => sub {
59 my ( $self, $amount ) = @_;
60 my $overdraft_amount = $amount - $self->balance();
61 if ( $overdraft_amount > 0 ) {
62 $self->overdraft_account->withdraw($overdraft_amount);
63 $self->deposit($overdraft_amount);
64 }
65 }
66 );
67
cc6c0b0b 68 ::throws_ok(
69 sub {
70 CheckingAccount->meta->add_before_method_modifier(
71 'does_not_exist' => sub { } );
72 },
73 qr/\QThe method 'does_not_exist' was not found in the inheritance hierarchy for CheckingAccount/
74 );
75
69b95026 76 ::ok( CheckingAccount->meta->has_method('withdraw'),
77 '... checking account now has a withdraw method' );
78 ::isa_ok( CheckingAccount->meta->get_method('withdraw'),
79 'Class::MOP::Method::Wrapped' );
80 ::isa_ok( BankAccount->meta->get_method('withdraw'),
81 'Class::MOP::Method' );
82}
ddc8edba 83
69b95026 84my $savings_account = BankAccount->new( balance => 250 );
85isa_ok( $savings_account, 'BankAccount' );
ddc8edba 86
69b95026 87is( $savings_account->balance, 250, '... got the right savings balance' );
ddc8edba 88lives_ok {
69b95026 89 $savings_account->withdraw(50);
90}
91'... withdrew from savings successfully';
92is( $savings_account->balance, 200,
6c681a5b 93 '... got the right savings balance after withdrawal' );
195f5bf8 94dies_ok {
69b95026 95 $savings_account->withdraw(250);
96}
97'... could not withdraw from savings successfully';
ddc8edba 98
99$savings_account->deposit(150);
69b95026 100is( $savings_account->balance, 350,
101 '... got the right savings balance after deposit' );
ddc8edba 102
103my $checking_account = CheckingAccount->new(
69b95026 104 balance => 100,
105 overdraft => $savings_account
106);
107isa_ok( $checking_account, 'CheckingAccount' );
108isa_ok( $checking_account, 'BankAccount' );
ddc8edba 109
69b95026 110is( $checking_account->overdraft_account, $savings_account,
111 '... got the right overdraft account' );
ddc8edba 112
69b95026 113is( $checking_account->balance, 100, '... got the right checkings balance' );
ddc8edba 114
115lives_ok {
69b95026 116 $checking_account->withdraw(50);
117}
118'... withdrew from checking successfully';
119is( $checking_account->balance, 50,
6c681a5b 120 '... got the right checkings balance after withdrawal' );
69b95026 121is( $savings_account->balance, 350,
6c681a5b 122 '... got the right savings balance after checking withdrawal (no overdraft)'
69b95026 123);
ddc8edba 124
96ceced8 125lives_ok {
69b95026 126 $checking_account->withdraw(200);
127}
128'... withdrew from checking successfully';
129is( $checking_account->balance, 0,
6c681a5b 130 '... got the right checkings balance after withdrawal' );
69b95026 131is( $savings_account->balance, 200,
6c681a5b 132 '... got the right savings balance after overdraft withdrawal' );
ddc8edba 133