OK; let me get a quick clarification here. How does: say "Hello, World!";
differ from: "Hello, World!".say; or: say $*OUT: "Hello, World!"; in terms of dispatching? And more generally, would there be a reasonable way to write a single routine (i.e., implementation) that could be invoked by a programmer's choice of these calling conventions, without redirects (i.e., code blocks devoted to the sole task of calling another code block)? Could you use binding? my sub say (String *$first, String *...@rest, OStream :$out = $*OUT, OStream :$err = $*ERR) { ... } role String { has &say:(String $first: String *...@rest, OStream :$out = $*OUT, OStream :$err = $*ERR) := &OUTER::say; } That (or something like it) might be doable. But in the spirit of TIMTOWTDI, I'd like to explore another possibility: what difficulties would arise from allowing subs to have signatures with invocants, which in turn allow the sub to be called using method-call syntax (though possibly not method dispatch semantics)? In effect, allow some syntactic sugar that allows properly-sigged subs outside of a role to masquerade as methods of that role. -- Jonathan "Dataweaver" Lang