Import of working code base

Signed-off-by: martin f. krafft <madduck@madduck.net>
diff --git a/storage/yaml_fs/directory.py b/storage/yaml_fs/directory.py
new file mode 100644
index 0000000..c085731
--- /dev/null
+++ b/storage/yaml_fs/directory.py
@@ -0,0 +1,53 @@
+#
+# -*- coding: utf-8 -*-
+#
+# This file is part of reclass (http://github.com/madduck/reclass)
+#
+# Copyright © 2007–13 martin f. krafft <madduck@madduck.net>
+# Released under the terms of the Artistic Licence 2.0
+#
+import os
+import sys
+
+SKIPDIRS = ( '.git' , '.svn' , 'CVS', 'SCCS', '.hg', '_darcs' )
+FILE_EXTENSION = '.yml'
+
+def vvv(msg):
+    #print >>sys.stderr, msg
+    pass
+
+class Directory(object):
+
+    def __init__(self, path, fileclass=None):
+        ''' Initialise a directory object '''
+        self._path = path
+        self._fileclass = fileclass
+        self._files = {}
+
+    def _register_files(self, dirpath, filenames):
+        for f in filter(lambda f: f.endswith(FILE_EXTENSION), filenames):
+            vvv('REGISTER {0}'.format(f))
+            f = os.path.join(dirpath, f)
+            ptr = None if not self._fileclass else self._fileclass(f)
+            self._files[f] = ptr
+
+    files = property(lambda self: self._files)
+
+    def walk(self, register_fn=None):
+        def _error(error):
+            raise Exception('{0}: {1} ({2})'.format(error.filename, error.strerror, error.errno))
+        if not callable(register_fn): register_fn = self._register_files
+        for dirpath, dirnames, filenames in os.walk(self._path,
+                                                      topdown=True,
+                                                      onerror=_error,
+                                                      followlinks=True):
+            vvv('RECURSE {0}, {1} files, {2} subdirectories'.format(
+                dirpath.replace(os.getcwd(), '.'), len(filenames), len(dirnames)))
+            for d in SKIPDIRS:
+                if d in dirnames:
+                    vvv('   SKIP subdirectory {0}'.format(d))
+                    dirnames.remove(d)
+            register_fn(dirpath, filenames)
+
+    def __repr__(self):
+        return '<{0} {1}>'.format(self.__class__.__name__, self._path)