private Object findDataInDirectoriesFor(Method m, Metadata md) {
        Iterator<Class<? extends Directory>> dirIter = directories.iterator();
        while (dirIter.hasNext()) {
            Class<? extends Directory> dir = dirIter.next();
            if (md.containsDirectory(dir)) {
                try {
                    Object retval = m.invoke(this, new Object[]{md.getDirectory(dir)});
                    LOG.log(Level.FINEST, "Successfully retrieved data using {0} in {1} for {2}", 
                            new Object[]{m.getName(), dir.getSimpleName(), absPath});
                    return retval;
                } catch (NullPointerException e) {
                    LOG.log(Level.FINEST, "{0} for {1}", new Object[]{e.getMessage(), absPath});
                } catch (IllegalAccessException | IllegalArgumentException ex) {
                    LOG.log(Level.SEVERE, "Reflection error", ex);
                    return null;
                } catch(InvocationTargetException ite) {
                    if(!(ite.getCause() instanceof NullPointerException)) {
                        LOG.log(Level.SEVERE, "Unexpected exception thrown from reflected method", ite.getCause());
                    }
                }
            } else {
                dirIter.remove();
                LOG.log(Level.FINEST, "Removing {0} from list of dirs for {1}", new Object[]{dir.getSimpleName(), absPath});
            }
        }
        throw new NullPointerException("Didn't find data with method: " + m.getName());
    }