Jack is tasked to write a role "Foo". He does his job right, and produces a role that perfectly produces the set of behaviours that it's supposed to. Among other things, he defines a method "&Foo::baz:()". He also writes a routine, "&foo:( Foo )", which calls &Foo::baz.
Jill is tasked to write a role "Bar". Bar has little if anything in common with Foo conceptually, but neither do the concepts clash with each other. She also does her job right, and produces a role that perfectly produces the set of behaviors that it's supposed to. Among other things, she defines a method "&Bar::baz:()". She also writes a routine, "&bar:( Bar )", which calls &Bar::baz. These events occur entirely independant of each other. Bob decides to create a class "Baz does Foo does Bar". Since the underlying concepts of the roles do not clash, he should be able to. However, because the independent designers of the roles both chose to use &baz:(), a collision occurs when Bob tries this. Here's Bob's dilemma: If he resolves the collision by having &Baz::baz call &Foo::baz, then 'foo ( Baz )' will work properly, but 'bar ( Baz )' will do strange things. Likewise, having &Baz::baz call &Bar::baz will let 'bar ( Baz )' work properly, but will cause 'foo ( Baz )' to behave strangely. While Bob could write a &Baz::foo method that calls &Foo::baz or a &Baz::bar method that calls &Bar::baz, 'foo ( Baz )' or 'bar ( Baz )' wouldn't know to call &Baz::foo or &Baz::bar (respectively) instead of &Baz::baz, and would still act strangely. It is not realistic to expect Bob to write a single routine that works properly in both cases, because the underlying concepts for Foo and Bar are so different from each other. Since Baz does both Foo and Bar, you cannot use type-checking to resolve this dilemma. The way things are now, it would appear that Bob's stuck. Short of rewriting one of ( Foo and foo ) or ( Bar and bar ) to use a different method name in place of baz, he can do nothing to resolve the syntactic collision between Foo and Bar while continuing to let foo and bar run properly. -- Thoughts? -- Jonathan "Dataweaver" Lang