Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Re^3: Modification of @ISA at run time

by nothingmuch (Priest)
on Sep 01, 2005 at 14:20 UTC ( [id://488386]=note: print w/replies, xml ) Need Help??


in reply to Re^2: Modification of @ISA at run time
in thread Modification of @ISA at run time

Well, the reimplementation of isa is probably the way to go, but normally I've found that the greater the all-knowingness of an object, the less I need to introspect it.

In a sense the behavior is transparent, instead of using a delegate there could have been an if/else on the member data in the single classes get_sunrise_time

My point is that when designing in this direction, usually you want to pretend that the object is the same, and the delegate is just an implementation detail. In situations when the role is truely different you don't want to instantiate from the same class anyway, you have have two top level classes, one for west-rising suns, and the other for east rising ones.

In fact, that is exactly what the delegation model is - it's two independant classes, completely unbound to each other, but interchangable, and an object which can reuse them to give you an alternative with a single point of entry.

Good examples of this kind of reuse can be dug up by querying Any... These are modules which usually wrap around several modules which do the same role, but have different features. The wrapper modules hide the details of the difference from the user, letting the user give the generic module more kinds of input, without caring which bunch of code really does the job at the end.

To wit, after saying

my $a = Archive::Any->new($archive_file);
I don't care if what I got was reblessed into a different class, or wheter it has a delegate, or whether it uses MMD inside. In fact, it probably isn't Archive::Tar at all, in any sense, since it doesn't provide it's full interface.

When ->isa checks are used with respect to the delegate for the prupose of type checking (what kind of archive format do you encapsulate, mr Archive::Any instance?), then it's perhaps a design problem, because not caring is the reason we wrapped it in the first place.

-nuffin
zz zZ Z Z #!perl

Replies are listed 'Best First'.
Re^4: Modification of @ISA at run time
by blazar (Canon) on Sep 01, 2005 at 14:59 UTC
    When ->isa checks are used with respect to the delegate for the prupose of type checking (what kind of archive format do you encapsulate, mr Archive::Any instance?), then it's perhaps a design problem, because not caring is the reason we wrapped it in the first place.
    But one may find desirable to have some common functionality plus extra type-specific features, e.g.
    if ($this->isa 'cool_archive') { print $this->name, " is a cool archive.\n", <<EOT; You also have the following cool features: ... (more cool features) EOT # interactively ask user to pick one... }
    Or is such a design to be considered inherently risky?
      This example is not well suited for a delegator model, but for a factory one, where each class presents it's routines to the routine displayer code (polymorphically, too - the code that has these archive plugins shouldn't care, it should only handle the interactivity).

      The open archive command takes a CLI, and dispatches to a factory constructor, that chooses the right class, and then the instance of this class is presented to the user with the enumerated options, extracted metadata, and so forth.

      -nuffin
      zz zZ Z Z #!perl
        TY again for the clarification. I understand what you mean. OTOH your own article at Re: Modification of @ISA at run time stresses the advantages of the delegator model over the class factory one when one has to deal with many methods needing different "versions" each depending on some conditions. So the question is: what if one has both requirements? I.e. the latter one on a set of "common" methods (exposing a uniform interface) and the need for type-specific features as well?

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://488386]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others sharing their wisdom with the Monastery: (2)
As of 2024-04-20 03:54 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found