What's wrong with reblessing then?
The variable keeping track of the actual type might be a good idea, but many of the methods will then look like
if ($somehow_is_a_foe) {
} else {
}
because the two share a lot, although they hardly share
anything.
Update: I have not yet thought about re-blessing. I think it's a good idea, worthwhile trying but if you say it's bad (or at least, will suck) I'll be glad to know why, just to find out if re-blessing is what I want.
| [reply] [Watch: Dir/Any] [d/l] |
No, I mean you plug it like this:
package Elf;
sub named {
my $class = shift;
bless {
Name => shift;
Actions => Elf::Live::,
Has => {},
}, $class;
}
sub die {
shift->{Actions} = Elf::Dead::;
}
sub can_attack { # delegate to actions
shift->{Actions}->can_attack(@_);
}
sub enemy_of {
shift->{Actions}->enemy_of(@_);
}
package Elf::Live;
sub can_attack { ... }
sub enemy_of { ... }
package Elf::Dead;
sub can_attack { ... }
sub enemy_of { ... }
A simple change of the Actions variable by plugging in a different
"behavior container" causes a bank-switch of those behaviors to a new
motif. I forget the "gang of four" pattern for this, but it's one of those. {grin}
| [reply] [Watch: Dir/Any] [d/l] |
| [reply] [Watch: Dir/Any] |
Ah! Now I see!
I think it's the best idea I've seen so far, assuming re-blessing really sucks. I'll have a look at it (a big re-style of the code is now required but it's worth it).
Just for my information, could you please tell me the disadvanteges of re-blessing?
| [reply] [Watch: Dir/Any] |