class FeatureLoader implements IFeatureLoader {

    @Override
    public IFeatureStatus loadGroup(final IPath groupPath)
            throws FeatureLoadException {
        try {
            FeatureStatusImpl metaFeatureStatus = getFeatureStatus0("group@" + groupPath.getPath());

            if (metaFeatureStatus.isInitialized()) {
                return metaFeatureStatus;
            }

            Set<FeatureStatusImpl> statuses = new HashSet<>();

            for (IPath path : fs.listSubdirectories(groupPath)) {
                FeatureStatusImpl status = loadFeature0(path);

                statuses.add(status);
                statuses.addAll(status.getDependencies());
            }

            for (FeatureStatusImpl dependencyStatus : statuses) {
                if (!dependencyStatus.isInitialized()) {
                    throw new FeatureLoadException(
                            MessageFormat.format("Feature named {0} not found.", dependencyStatus.getId()));
                }

                metaFeatureStatus.addDependency(dependencyStatus);
            }

            metaFeatureStatus.init(groupPath, IOC.resolve(Keys.getOrAdd("info.smart_tools.smartactors.iobject.iobject.IObject")));

            preStartProcess(metaFeatureStatus);

            for (FeatureStatusImpl status : statuses) {
                status.load();
            }

            metaFeatureStatus.load();

            return metaFeatureStatus;
        } catch (IOException | FeatureLoadException | ActionExecuteException | ResolutionException e) {
            throw new FeatureLoadException(
                    MessageFormat.format("Error occurred loading features from ''{0}''.", groupPath.getPath()), e);
        }
    }

    public  FeatureLoader();

}