http://www.perlmonks.org?node_id=1056126


in reply to Re^3: Can't locate object method- Issue
in thread Can't locate object method- Issue

Is there any way that a role can be removed after being assigned to a object? In my case, I would like to have a role assigned to an object, but during the course of the script, my roles for the particular object need to be modified. I want to remove the earlier role and add a new role to the object. Is there a way to do this?

Replies are listed 'Best First'.
Re^5: Can't locate object method- Issue
by Corion (Patriarch) on Sep 28, 2013 at 12:54 UTC

    This sounds like horribly bad design.

    You haven't told us what problem you are trying to solve by this approach, but from my perspective, it looks as if your approach would be far better served by an object A that has another object B, which gets removed or replaced by a third object C if its behavirour needs to change:

    A -> B # Change behaviour: A -> C

    Maybe, B and C can implement some roles, but the interface of A should remain identical and delegate to its worker, B or C.

      Well, that's a classic OO pattern (delegation), but IMHO having whole objects just to contain a subset of behavior is overkill. Roles are packages of behavior explicitly.

      I reckon we are the only monastery ever to have a dungeon stuffed with 16,000 zombies.

        Certainly, but at least to my superficial understanding of Roles, you are not supposed to change your mind after the fact. Once you've mixed together some Roles in a class, you are not supposed to change the class further, or even worse, make changes on a per-object basis.

        If you need to dynamically change the class hierarchy/composition, or need to change the behaviour on a per-object basis, in my opinion, you should look at using objects that delegate to other objects instead.

        Meta: I came back to this comment due to the (maybe continued) discussion of the topic in 1056122.