in reply to Reclassifying an object

Using bare data structures makes it impossible to use methods. Therefore, using a parent class at the beginning sounds reasonable.

The child classes could have a method to create an instance from a given parent class instance, and you can implement it any way you like - rebless the object, or rebless its clone, and so on, plus all the checks you need to allow the transition. Thus, the "dirty" code stays in the class and doesn't pollute your users' code.

لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ

Replies are listed 'Best First'.
Re^2: Reclassifying an object
by Amblikai (Scribe) on Sep 29, 2015 at 11:25 UTC

    I follow you and thanks for your reply. I'm not sure how to go about reblessing the object though.

    As i see it i could:

    • Have the constructor call the method to determine the class, and immediately rebless the object as some other class. The problem i see here is that now the parent class has to have knowledge of it's child classes which i think breaks inheritance?
    • Or i could interrogate the type in the main script and create a clone of a different (sub)class. This seems inefficient to me and it seems like i'm bringing the code out of the classes and into the main script.

    Am i needlessly overcomplicating things?

    I found this code: Stack Overflow But to be honest i'm having real trouble following what the user is doing here!

      I imagined the second solution:
      my $obj = 'Parent'->new; $obj->populate(@data); for my $child_class (@possible_child_classes) { if (my $new = $child_class->new_from_parent($obj)) { $obj = $new; last } } # Don't forget to handle the case that $obj hasn't changed.

      In fact, the only problem why this shouldn't go to the parent class is the array of possible child classes. So, get it from outside; the parent can insist on its children implementing a method:

      sub new_from_parent { die "Should be overriden.\n" } sub rebless { my $self = shift; my @possible_child_classes = @_; for my $child_class (@possible_child_classes) { # etc. using $self instead of $obj.

      And the code becomes

      my $obj = 'Parent'->new; $obj->populate(@data); $obj->rebless(@possible_child_classes);
      لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
      The problem i see here is that now the parent class has to have knowledge of it's child classes which i think breaks inheritance?

      As Salvor Hardin used to say, never let your sense of morals prevent you from doing what is right!