```Dave Whipp wrote:
> Jon Lang wrote:
>>
>>  my (\$num, \$denom) = \$num.^attr; # \$num.WHAT == Ratio;
>>  my (\$mag, \$phase) = Complex::Polar(\$z).^attr;
>>  my (\$re, \$im) = Complex::Cartesian(\$z).^attr;
>>  my (\$x, \$y) = \$vector.^attr »·« ( [1, 0], [0, 1] );
>
> If I'm reading this right, the .^attr is exposing implementation details of
> the object to get its components. To my mind that is not desirable.```
```
The reason that HOW is spelled in allcaps is because it can be used in
undesirable ways.  In particular, whedn you introspect an object,
you're looking at its implementation details.

And really, my whole point is that the implementation details are
(conceptually) the only thing that distinguishes Complex::Polar from
Complex::Cartesian.  More on this below.

> And I think there's a Math error in the 4th line: you don't need the
> components of a vector to do a dot product with that vector -- so it is just
>
>   my (\$x, \$y) = \$vector «·« ( [1, 0], [0, 1] );

True enough.

> Which makes me wonder if all of them are just the dot-product of an object
> with a role (i.e. it uses the .^attr of the role, not the object):

The role may not have a .^attr; in particular, I'd expect the
following to be true:

role Complex {
...
method re() { ... }
method im() { ... }
method abs() { ... }
method arg() { ... }
} # no "has" declarations
class Complex::Cartesian does Complex { has \$re, \$im; ... }
class Complex::Polar does Complex { has \$abs, \$arg; ... }

There's another problem with my proposal, namely the fact that
introspection of a package's component parts shouldn't be expected to
preserve the order of said components.  But setting that aside for the
moment: Complex.^attr ought to return an empty list, since no
attributes were declared in it; Complex::Polar.^attr ought to return a
magnitude and an argument (i.e., an angle); and
Complex::Cartesian.^attr ought to return a real value and an imaginary
value.

--
Jonathan "Dataweaver" Lang
```