In auto-generating the code to serialize arbitrary objects, I might have an element definition which looks like this:
- phone+
- method: phone_numbers
type: string
And that generates code which looks like this:
my $count = 0;
foreach my $phone ( $instance->phone_numbers ) {
$count++;
push @{ $self->{data}{elements} } => {
name => 'phone',
attributes => {},
value => $phone,
};
}
unless ($count) {
croak("Method 'phone_numbers' failed to return at least one element");
}
But what if phone_numbers returns an array reference? One thing I can do is make this explicit by prepending the attribute name with an '@' symbol.
- @phone+
- method: phone_numbers
type: string
The '@' would only be valid if a '*' or '+' quantifier was on the element (or attribute) name. I've already done this and it makes the relevant bit of code look like this:
foreach my $phone ( @{ $instance->phone_numbers } ) {
However, I've been giving this some thought and I realized that if we have '*' or '+' quantifiers, the code should just know it needs to dereference an array reference, if found. This complicates things internally, but makes the user interface more DWIMery. However, DWIMery is a very Bad Thing if Do What I Mean doesn't match Do What You Need. I'll leave it explicit for right now, but I need to give this some thought.
Oh, and if you have no quantifier or a '?' quantifier, then the '$' prefix becomes valid to force scalar context (in case the method returns a list). Since there is no real way to automagically determine if this is what happens, a '$' prefix becomes mandatory.