You can bind to paths containing wildcards to watch for changes to properties on items in an array:

model.bind('[thing/*/stuff/*/a]', function(event){
alert(event.getValue());
});
gedi.set('[thing/1/stuff/1/a]', 1); // will alert 2
gedi.set('[thing/2/stuff/2/b]', 2); // will not trigger the callback, because the triggered path does not match the bound path

if an Expression is passed to bind(), it will automatically detect every binding in the expression and set the callback to trigger when any referenced parts of the model changes.

model.bind('(|| [a] [b] [c])', function(event){
// Do something.
});

The event object passed to the callback has a number of properties that can be useful:

target: The path that triggered the callback
binding: The expression that the callback is bound to.
captureType: can be 'target', 'bubble', 'sink', or 'arrayItem'.
- target means the event was captured directly on the target path
- sink means the event was caused at a a parent path, and has sunk down to the bound path
- bubble means the event was caused by a child path, and has bubbled up to the bound path
- arrayItem is a type of bubble, but where the target path was a direct child of an array.
this is usefull because effecting array children can affect the array's lenght property.
getValue: a callback that can be used to evaulate the expression that was used to bind the callback, and return the value, eg:
model.bind('(|| [a] [b] [c])', function(event){
alert(event.getValue());
});
model.set('[b]', 'b is now truthy'); // will alert b
model.set('[a]', 'a is now truthy'); // will alert a
model.set('[c]', 'c is now truthy'); // will alert a because a is already set, and it is truthy

Expressions with wildcards are not supported, as there is no logical way to handle an expression containing more than one wildcarded path.