ignore missing class by regexp
diff --git a/reclass/adapters/salt.py b/reclass/adapters/salt.py
index d7d34f0..5b493a0 100755
--- a/reclass/adapters/salt.py
+++ b/reclass/adapters/salt.py
@@ -25,7 +25,8 @@
                classes_uri=OPT_CLASSES_URI,
                class_mappings=None,
                propagate_pillar_data_to_reclass=False,
-               ignore_class_notfound=OPT_IGNORE_CLASS_NOTFOUND):
+               ignore_class_notfound=OPT_IGNORE_CLASS_NOTFOUND,
+               ignore_class_regexp=OPT_IGNORE_CLASS_REGEXP):
 
     nodes_uri, classes_uri = path_mangler(inventory_base_uri,
                                           nodes_uri, classes_uri)
@@ -35,7 +36,8 @@
     if propagate_pillar_data_to_reclass:
         input_data = pillar
     reclass = Core(storage, class_mappings, input_data=input_data,
-                   ignore_class_notfound=ignore_class_notfound)
+                   ignore_class_notfound=ignore_class_notfound,
+                   ignore_class_regexp=ignore_class_regexp)
 
     data = reclass.nodeinfo(minion_id)
     params = data.get('parameters', {})
@@ -50,14 +52,17 @@
 def top(minion_id, storage_type=OPT_STORAGE_TYPE,
         inventory_base_uri=OPT_INVENTORY_BASE_URI, nodes_uri=OPT_NODES_URI,
         classes_uri=OPT_CLASSES_URI,
-        class_mappings=None, ignore_class_notfound=OPT_IGNORE_CLASS_NOTFOUND):
+        class_mappings=None,
+        ignore_class_notfound=OPT_IGNORE_CLASS_NOTFOUND,
+        ignore_class_regexp=OPT_IGNORE_CLASS_REGEXP):
 
     nodes_uri, classes_uri = path_mangler(inventory_base_uri,
                                           nodes_uri, classes_uri)
     storage = get_storage(storage_type, nodes_uri, classes_uri,
                           default_environment='base')
     reclass = Core(storage, class_mappings, input_data=None,
-                   ignore_class_notfound=ignore_class_notfound)
+                   ignore_class_notfound=ignore_class_notfound,
+                   ignore_class_regexp=ignore_class_regexp):
 
     # if the minion_id is not None, then return just the applications for the
     # specific minion, otherwise return the entire top data (which we need for
@@ -106,7 +111,8 @@
                               nodes_uri=options.nodes_uri,
                               classes_uri=options.classes_uri,
                               class_mappings=class_mappings,
-                              ignore_class_notfound=options.ignore_class_notfound)
+                              ignore_class_notfound=options.ignore_class_notfound,
+                              ignore_class_regexp=options.ignore_class_regexp)
         else:
             data = top(minion_id=None,
                        storage_type=options.storage_type,
@@ -114,7 +120,8 @@
                        nodes_uri=options.nodes_uri,
                        classes_uri=options.classes_uri,
                        class_mappings=class_mappings,
-                       ignore_class_notfound=options.ignore_class_notfound)
+                       ignore_class_notfound=options.ignore_class_notfound,
+                       ignore_class_regexp=options.ignore_class_regexp)
 
         print output(data, options.output, options.pretty_print)
 
diff --git a/reclass/cli.py b/reclass/cli.py
index 8f4617b..d7e22b7 100644
--- a/reclass/cli.py
+++ b/reclass/cli.py
@@ -29,7 +29,7 @@
         storage = get_storage(options.storage_type, options.nodes_uri,
                               options.classes_uri, default_environment='base')
         class_mappings = defaults.get('class_mappings')
-        reclass = Core(storage, class_mappings, ignore_class_notfound=options.ignore_class_notfound)
+        reclass = Core(storage, class_mappings, ignore_class_notfound=options.ignore_class_notfound, ignore_class_regexp=options.ignore_class_regexp)
 
         if options.mode == MODE_NODEINFO:
             data = reclass.nodeinfo(options.nodename)
diff --git a/reclass/config.py b/reclass/config.py
index fca982f..36fbf5a 100644
--- a/reclass/config.py
+++ b/reclass/config.py
@@ -32,6 +32,9 @@
     ret.add_option('-z', '--ignore-class-notfound', dest='ignore_class_notfound',
                    default=defaults.get('ignore_class_notfound', OPT_IGNORE_CLASS_NOTFOUND),
                    help='decision for not found classes [%default]')
+    ret.add_option('-x', '--ignore-class-regexp', dest='ignore_class_regexp',
+                   default=defaults.get('ignore_class_regexp', OPT_IGNORE_CLASS_REGEXP),
+                   help='decision for not found classes [%default]')
     return ret
 
 
diff --git a/reclass/core.py b/reclass/core.py
index 0c8543d..c93ab14 100644
--- a/reclass/core.py
+++ b/reclass/core.py
@@ -19,12 +19,17 @@
 class Core(object):
 
     def __init__(self, storage, class_mappings, input_data=None,
-            ignore_class_notfound=False):
+            ignore_class_notfound=False, ignore_class_regexp=['*']):
         self._storage = storage
         self._class_mappings = class_mappings
         self._ignore_class_notfound = ignore_class_notfound
         self._input_data = input_data
 
+        if type(self._ignore_class_regexp) == type(''):
+          self._ignore_class_regexp = [ignore_class_regexp]
+        else:
+          self._ignore_class_regexp = ignore_class_regexp
+
     @staticmethod
     def _get_timestamp():
         return time.strftime('%c')
@@ -90,13 +95,17 @@
         if merge_base is None:
             merge_base = Entity(name='empty (@{0})'.format(nodename))
 
+        cnf_r = None # class_not_found_regexp compiled
         for klass in entity.classes.as_list():
             if klass not in seen:
                 try:
                     class_entity = self._storage.get_class(klass)
                 except ClassNotFound, e:
                     if self._ignore_class_notfound:
-                        continue
+                        if not cnf_r:
+                            cnf_r = re.compile('||'.join([re.escape(x) for x in self._ignore_class_regexp]))
+                        if cnf_r.match(klass):
+                            continue
                     e.set_nodename(nodename)
                     raise e
 
diff --git a/reclass/defaults.py b/reclass/defaults.py
index 3892a89..0180521 100644
--- a/reclass/defaults.py
+++ b/reclass/defaults.py
@@ -17,6 +17,7 @@
 OPT_PRETTY_PRINT = True
 OPT_OUTPUT = 'yaml'
 OPT_IGNORE_CLASS_NOTFOUND = False
+OPT_IGNORE_CLASS_REGEXP = ['*']
 
 CONFIG_FILE_SEARCH_PATH = [os.getcwd(),
                            os.path.expanduser('~'),