(Note more precise topic.) > -----Original Message----- > From: Aaron Sherman [mailto:[EMAIL PROTECTED] > > On Fri, 2004-04-30 at 17:58, Austin Hastings wrote: > > > class Session > > { > > does ListOfMessages > > ( > > attribute_base => 'messages', > > method_base => 'messages', > > display_color => 'black' > > ); > > > > does ListOfMessages > > ( > > attribute_base => 'errors', > > method_base => 'errors', > > display_color => 'red' > > ); > > > > ... > > } > > > Can I just do: > > > > role ListOfMessages($attribute_base, $method_base, > $display_color) {...} > > I think you want a combination of re-dispatch and delegation: > > class Session { > role EventHandler { > # The one and only place you define the behavior > method clear() {...} > method add() {...} > method have() {...} > method get() {...} > } > class ErrorHanlder { > does EventHandler; > # Probably should do some funky re-dispatch thing > method clear_errors() { .clear() } > method add_errors() { .add() } > method have_errors() { .have() } > method get_errors() { .get() } > } > class MessageHanlder { > does EventHandler; > method clear_messages() { .clear() } > method add_messages() { .add() } > method have_messages() { .have() } > method get_messages() { .get() } > } > has ErrorHanlder $:errors handles <<clear_errors > add_errors have_errors get_errors>>; > has MessageHandler $:messages handles > <<clear_messages add_messages have_messages get_messages>>; > } > > That should do what you want.
Well, not really: 1- It required a lot of text for little gain. 2- Most of the required text was redundant. What I want is probably something like this: role ListOfMessages[$method_base] { is Array; handles (s/_$method_base/_messages/); method clear_messages() { .clear(); } method add_message($msg) { .push($msg); } method have_messages() { return .#; } # Isn't there a .# property for arrays? method get_messages() { return $_; } } which is close to the same size as the original implementation, but still doesn't speak to collision of the two lists: messages and arrays. I can move the data declaration into the class, but this loses encapsulation: class Session { has @:messages does ListOfMessages«messages»; has @:errors does ListOfMessages«errors»; } It would be even better, of course, if the role could introspect the variable name (assuming there is one, which isn't always true) and default to using that for its method_base. =Austin