in reply to Re^6: a State machine with Roles - possible? (class or instance)
in thread a State machine with Roles - possible?

I'm not sure if you are getting my point.

Let's say I want to model a house with 100 doors.

The Ruby code allows to call 100 times new() from class "Door" to create 100 door objects with independent states, because the methods of the mixins belong to the objects.

The shown Moose code OTOH needs 100 packages achieve this, cause all objects of such a package share the same roles. This doesn't sound very handy or scalable.

And I couldn't see any code to generate such classes, hence we have to manually name them Door1, Door2, ...Door100.

Plz correct me if I'm wrong.

Cheers Rolf

( addicted to the Perl Programming Language)

  • UPDATE 01 Jun 2013

    oops, I just realized that you already explained the mechanism behind apply_all_roles further up this thread. Sorry, I wasn't aware we are talking about the same approach.

    • Comment on Re^7: a State machine with Roles - possible? (class or instance)
  • Replies are listed 'Best First'.
    Re^8: a State machine with Roles - possible? (class or instance)
    by mascip (Pilgrim) on May 31, 2013 at 16:41 UTC

      I don't know how Ruby mixins works, and i'm not sure how Moose/Moo implement it exactly, but i know that it's possible to have each Door be in a different state. Because that is what apply_all_roles_to($object, @roles) is for: it does not apply to the whole class, but only to one object.

      I have no idea about the scalability. I think that Salva made a good point: if it gets that complicated, i'll probably want to re-think my design.

        Ahh OK I didn't check the documentation in Moose::Util ... =)

        apply_all_roles($applicant, @roles)

        This function applies one or more roles to the given $applicant The applicant can be a role name, class name, or object.

        The $applicant must already have a metaclass object.

        The list of @roles should a list of names or Moose::Meta::Role objects, each of which can be followed by an optional hash reference of options (-excludes and -alias).

        but couldn't find a description for metaclass either, I suppose a package container for roles.

        Just for a better understanding, where in your code did you assure that the $applicant already has a metaclass object?

        Cheers Rolf

        ( addicted to the Perl Programming Language)

          Sorry, i didn't realize that the documentation was not clear enough (indeed). apply_all_roles() gives a meta to the instance. For example the class of my $door instance is an anonymous class called 'Moose::Meta::Class::__ANON__::SERIAL::16=HASH(0x9ac4b8)'. I have made tests: each door can be in a different state (i'm lazy to share these: while trying to unapply Roles on more complex examples, i have lost these tests)

          But i don't manage to unapply a Role, and i think there's a better way anyway (see message below)