void EnumerateClassesForProvider(Service *provider, const Function<bool (MetaClass *meta, Dictionary *properties)> &callback) { MetaClass *providerClass = provider->GetClass(); spinlock_lock(&_matchingLock); Array *matches = Array::Alloc()->Init(); for(size_t i = 0; i < _registeredClasses->GetCount(); i ++) { ClassEntry *entry = _registeredClasses->GetObjectAtIndex<ClassEntry>(i); if(!entry->IsMatched() && DoShallowMatch(providerClass, entry)) matches->AddObject(entry); } spinlock_unlock(&_matchingLock); for(size_t i = 0; i < matches->GetCount(); i ++) { ClassEntry *entry = matches->GetObjectAtIndex<ClassEntry>(i); if(callback(entry->GetMeta(), entry->GetProperties())) entry->SetMatched(true); } matches->Release(); }