Since hdp and schwern both recommended that I specify elements in Bermuda Island files as a list of key/value pairs, I've gone ahead and tried it out. It much easier to read now. I have this:
--- package: Some::Class island: dummy attributes: name: type: string version?: type: integer some_val?: type: integer if: $instance->some_val > 1 elements: - personal_email: type: string method: email('personal') - work_email: type: string method: email('work')
Turning into this:
{ "elements" : [ { "value" : "victoria@example.com", "name" : "personal_email" }, { "value" : "victoria@some_company.com", "name" : "work_email" } ], "name" : "dummy", "attributes" : { "version" : 3, "name" : "Victoria", "some_val" : 4 } }
Obviously that's just the built-in JSON serialization.
Unless I get radically more free time soon, I likely won't be able to do much more for a couple of weeks.
I also note that if I make attributes an ordered list of k/v pairs, then the attribute and element syntax becomes identical, with the exception that attributes are not allowed to have '*' or '+' quantifiers. This would be very, very handy. However, attributes in XML are, by definition, not ordered, so imposing an order sounds wrong. On the other hand, imposing an order, even as a convenient side-effect, shouldn't hurt consumers of the serialized data structures and might help poorly coded consumers. Also, simply making it easier to write Island files by normalizing the syntax is very appealing.
Update: Yuck. I need to clean up my JSON and YAML even more. That should read:
{ "elements" : [ "personal_email" : "victoria@example.com", "work_email" : "victoria@some_company.com" ], "name" : "dummy", "attributes" : { "version" : 3, "name" : "Victoria", "some_val" : 4 } }