Reading the source codes, I think this is due to no one yet having requested the ability to do so. To me it feels like implementing this is possible, but tedious.
The simple work-around for the problem would be to rebless the instance. Example:
class Structure {}
role Floatable {}
role Inhabitable {}
class Houseboat extends Structure with Floatable with Inhabitable {}
$hb = Houseboat new
$s = Structure new
$s apply Floatable, Inhabitable # houseboat at run-time
# stop swimming
### NYI
### $s unapply Floatable
# make a new house that cannot swim
$s1 = Structure new
$s1 apply Inhabitable
$s1 = $s rebless_into $s1
But note that the point of an ECS is being able to dynamically change roles without recreating new entities. If changing a house into a houseboat means creating a new entity, then everyone who had a reference to the house would need to be informed of the new reference.
I'm not sure I follow. In ECSs that I'm familiar with, entities are integer IDs, not class objects. So adding or removing components (roles) to an entity doesn't make use of any language-level features, it's just calls to the ECS library. E.g. in JS:
var id = ecs.createEntity() // returns an int
ecs.addComponent(id, 'house')
ecs.addComponent(id, 'boat')
So, very different from the class-based approach being floated a few comments ago. Does that answer your question?
https://metacpan.org/dist/Moose/source/lib/Moose/Meta/Role/A...
https://github.com/rakudo/rakudo/blob/master/src/Perl6/Metam...
Reading the source codes, I think this is due to no one yet having requested the ability to do so. To me it feels like implementing this is possible, but tedious.
The simple work-around for the problem would be to rebless the instance. Example: