Class::Struct comparison & MOP

1 How do I compare Class::Struct instances (objects)
for equality (or precedence)?

E.g.,

use Class::Struct MyStruct =>
[foo => '$',
bar => '$',
baz => '$'];

my MyStruct $a = MyStruct->new(foo => "a");
my MyStruct $b = MyStruct->new(bar => "b");
my MyStruct $a1 = MyStruct->new(foo => "a");

Both ($a eq $a1) and ($a eq $b) return false which is wrong for the
first expression.
I can write my own comparison, of course:

sub struct_eq ($$) {
my ($x,$y) = [at] _;
List::AllUtils::notall
(sub { $_ }, (List::AllUtils::pairwise
(sub { $a eq $b }, [at] $x, [at] $y)));
}

but this does simple version does not work because some fields are
undefined and I have to check than and it quickly becomes a nightmare.
I could write a tedious function like

sub MyStruct_eq ($$) {
my ($x,$y) = [at] _;
(defined $x->foo and defined $y->foo and $x->foo eq $y->foo)
or (not defined $x->foo and not defined $y->foo)
.....
}

but there must be a better way.

2. Is there a way to get a list of all fields in a struct?
Class::Fields seems to claim to be able to do it, but I cannot figure
out how to use it.
Class::Fields->show_fields('MyStruct') returns nothing.
MyStruct->show_fields is not defined.
I am lost.

I would also like to be able to access MyStruct instance fields by name.
I know I can do that using hash{} instead of array[] in the definition,
but I would like to preserve the underlying array structure for passing
to Text::CSV functions (I guess I could use "values" for that too).
E.g., I want to be able to write something like

my $mystruct_foo_pos = MyStruct->getpos('foo');

and have $mystruct_foo_pos set to 0.
then I will be able to write

my MyStruct $a = MyStruct->new(...);

$a[$mystruct_foo_pos] = "a";


Thanks!

--
Sam Steingold (http://sds.podval.org/) on CentOS release 5.3 (Final) X
http://iris.org.il http://pmw.org.il http://memri.org http://ffii.org
http://dhimmi.com http://palestinefacts.org http://jihadwatch.org
My other CAR is a CDR.

--
To unsubscribe, e-mail: beginners-unsubscribe [at] perl.org
For additional commands, e-mail: beginners-help [at] perl.org
http://learn.perl.org/
Sam Steingold [ Fr, 04 März 2011 00:27 ] [ ID #2056223 ]
Perl » gmane.comp.lang.perl.beginners » Class::Struct comparison & MOP

Vorheriges Thema: Class::Struct comparison & MOP
Nächstes Thema: Please put the sources of the book "Modern Perl" under CC-by-sa