> While my last post was about removing entities, this one will be about
> adding them.
>
> Now, I don't know what Larry has up his sleeve in this respect, but as
> I see it now, C<is> is too heavily overloaded.  As it stands, it means
> 3 things:
>
>     (1) Attributing traits
>     (2) Inheriting base classes
>     (3) "Tying" variables
But in all three cases, C<is> is being used to set a trait on a
container. Here's my take on what happens during an 'is' set up:
    my $foo is Bar(baz);
is equivalent to:
    given \$foo {
        .ADD_TRAIT(Bar, baz);
    }
class Foo is Base {...}
becomes (sort of) equivalent to:
    given Class.new('Foo') {
        .ADD_TRAIT(Base);
        .ADD_TRAIT(definition, {...});
    }
If we have the definitions
    # Assuming *everything* inherits from object...
    multi ADD_TRAIT (Object $self is rw: Object $trait, *@args)  {
        $trait.can('ADD_TRAIT_TO') ?? $trait.ADD_TRAIT_TO($self, *@args)
                                   :: $self.prop($trait, @args);
    }
    multi ADD_TRAIT (Class $self is rw: Class $trait) {
        $self.add_base_class($trait);
    }
    class Tie::Scalar {
        classmethod ADD_TRAIT_TO ($target is rw, *@args) {
            $target = .new.TIESCALAR(*@args);
        }
        method TIESCALAR {...}
        method FETCH {...}
        method STORE ($newval) {...}
        method CLEAR {...}
    }
The details are almost certainly wrong, but the important thing to
remember is that a Class is just another container with slightly
different semantics for handling its traits...
-- 
Piers
[snip]
> The details are almost certainly wrong, but the important thing to
> remember is that a Class is just another container with slightly
> different semantics for handling its traits...
Multimethods fit the implementation bill rather nicely.
Unfortunately, I wasn't talking about implementation (Our p6i team is
super-competent).  I think the I<language> is too ambiguous.  
My primary concern is with the
class Foo is Bar { }
syntax, being ambiguous with attributing a trait on the class.  If
classes themselves can't have traits... okay.  But I think they
should, and that it should be distinct from inheritance, seeing as
classes are "first-class objects" now.
And I don't want it to depend on whether Bar was declared a class or a
trait. 
Also, this syntax (which we mortals came up with, with no conformation
from the design gods) would pose a problem:
class Baz ::= Foo is Bar;
Then the first definition could I<also> be confused with attributing a
trait on every instance of a Foo class, rather than the class itself.
But, this is all A12, and we're not even to 8.  So, I'll hold off for
now, and see what cognitive magic Larry & co. come up with for this
syntax (if it stays).
Luke