Larry Wall wrote:
On Fri, Dec 10, 2004 at 11:05:32AM -0500, Abhijit Mahabal wrote:
: Consider a class (e.g., the hypothetical Geometry::Triangle) that can : have several attributes (side1, side2, side3, angle1, ang_bisector1, : side_bisector, altitude1 and so forth), most of which will not be : needed for most instances of Geometry::Triangle.


This sounds to me more like a situation where you want to use mixins,
if you're thinking of it as different kinds of triangles.

But more likely, you just want a single private hash attribute that is
manipulated by as many publicly facing methods as you like.  Method
declarations don't cost you anything on a per-object basis unless they're
autogenerated from an attribute.  But a hash attribute autovivifies
just like any ordinary hash variable, and is probably clearer as well
to whoever has to read your code.


So, apart from declaring the methods, I just need to write

.bisector1 = ...;

instead of

$.bisector1 = ...;

Yes, that looks almost as nice as with the $, though perhaps a tad less. That leaves the issue of writing several methods that look like:

method bisector1() is rw { return %:att<bisector1> };

Here is an attempt to do this using traits:

#============================================
role hash_attributes {
  has %:att;
  multi sub trait_auxillary:<has>(hash_attributes $trait,
                                 Class $container :
                                 [EMAIL PROTECTED]
                                ){
    $container does hash_attributes;
    for @atts -> $att {
        &($container)::($att) := method () is rw { return %:att{$att} };
    }
  }
}

class Geometry::Triangle
  has hash_attributes <== <side1 side2 side3 angle1 angle2 angle3 ...>
{

  method calculate_sides(){
    .side1 = ...;
  }
}

#=============================================

Does that look about right?

I'd just use a hash attribute.  All other things being equal, go for
simple and standard.

Does it look about standard? (especially the bit using the pipe operator)...

Thanks,
  abhijit

Reply via email to