4 use Test::More tests => 20;
19 BankAccount->meta->add_attribute(
21 accessor => 'balance',
22 init_arg => 'balance',
27 sub new { (shift)->meta->new_object(@_) }
30 my ( $self, $amount ) = @_;
31 $self->balance( $self->balance + $amount );
35 my ( $self, $amount ) = @_;
36 my $current_balance = $self->balance();
37 ( $current_balance >= $amount )
38 || confess "Account overdrawn";
39 $self->balance( $current_balance - $amount );
42 package CheckingAccount;
48 use base 'BankAccount';
50 CheckingAccount->meta->add_attribute(
51 'overdraft_account' => (
52 accessor => 'overdraft_account',
53 init_arg => 'overdraft',
57 CheckingAccount->meta->add_before_method_modifier(
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);
70 CheckingAccount->meta->add_before_method_modifier(
71 'does_not_exist' => sub { } );
73 qr/\QThe method 'does_not_exist' was not found in the inheritance hierarchy for CheckingAccount/
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' );
84 my $savings_account = BankAccount->new( balance => 250 );
85 isa_ok( $savings_account, 'BankAccount' );
87 is( $savings_account->balance, 250, '... got the right savings balance' );
89 $savings_account->withdraw(50);
91 '... withdrew from savings successfully';
92 is( $savings_account->balance, 200,
93 '... got the right savings balance after withdrawal' );
95 $savings_account->withdraw(250);
97 '... could not withdraw from savings successfully';
99 $savings_account->deposit(150);
100 is( $savings_account->balance, 350,
101 '... got the right savings balance after deposit' );
103 my $checking_account = CheckingAccount->new(
105 overdraft => $savings_account
107 isa_ok( $checking_account, 'CheckingAccount' );
108 isa_ok( $checking_account, 'BankAccount' );
110 is( $checking_account->overdraft_account, $savings_account,
111 '... got the right overdraft account' );
113 is( $checking_account->balance, 100, '... got the right checkings balance' );
116 $checking_account->withdraw(50);
118 '... withdrew from checking successfully';
119 is( $checking_account->balance, 50,
120 '... got the right checkings balance after withdrawal' );
121 is( $savings_account->balance, 350,
122 '... got the right savings balance after checking withdrawal (no overdraft)'
126 $checking_account->withdraw(200);
128 '... withdrew from checking successfully';
129 is( $checking_account->balance, 0,
130 '... got the right checkings balance after withdrawal' );
131 is( $savings_account->balance, 200,
132 '... got the right savings balance after overdraft withdrawal' );