function featuresLoad(Gadget $gadget, $context) { // Process required / desired features $requires = $gadget->getRequires(); $needed = array(); $optionalNames = array(); foreach ($requires as $key => $entry) { $needed[] = $key; if ($entry->isOptional()) { $optionalNames[] = $key; } } $resultsFound = array(); $resultsMissing = array(); $missingOptional = array(); $missingRequired = array(); $context->getRegistry()->getIncludedFeatures($needed, $resultsFound, $resultsMissing); foreach ($resultsMissing as $missingResult) { if (in_array($missingResult, $optionalNames)) { $missingOptional[$missingResult] = $missingResult; } else { $missingRequired[$missingResult] = $missingResult; } } if (count($missingRequired)) { throw new GadgetException("Unsupported feature(s): " . implode(', ', $missingRequired)); } // create features $features = array(); foreach ($resultsFound as $entry) { $features[$entry] = $context->getRegistry()->getEntry($entry)->getFeature()->create(); } // prepare them foreach ($features as $key => $feature) { $params = $gadget->getFeatureParams($gadget, $context->getRegistry()->getEntry($key)); $feature->prepare($gadget, $context, $params); } // and process them foreach ($features as $key => $feature) { $params = $gadget->getFeatureParams($gadget, $context->getRegistry()->getEntry($key)); $feature->process($gadget, $context, $params); } }