spec = yaml.safe_load(stream)
 
         metrics = self._task.args.get('metrics')
-        export_to = self._task.args.get('export_to')
+        dest = self._task.args.get('dest')
 
-        return calc_qpi(spec, metrics, export_to)
+        return calc_qpi(spec, metrics, dest=dest)
 
 
-def calc_qpi(qpi_spec, metrics, dest=None):
+@export_to_file
+def calc_qpi(qpi_spec, metrics):
 
     display.vv("calculate QPI {}".format(qpi_spec['name']))
     display.vvv("spec: {}".format(qpi_spec))
         'metrics': metrics
     }
 
-    if dest is not None:
-        export_to_file(results, dest)
-
     return results
 
 
 
 
         string = self._task.args.get('string')
         patterns = self._task.args.get('patterns')
-        export_to = self._task.args.get('export_to')
+        dest = self._task.args.get('dest')
 
-        return collect(patterns, string, export_to)
+        return collect(patterns, string, dest=dest)
 
 
-def collect(patterns, string, dest=None):
+@export_to_file
+def collect(patterns, string):
     """collect all named subgroups of the match into a list keyed by subgroup name
     """
     captured = defaultdict(list)
             for (key, value) in match_obj.groupdict().items():
                 captured[key].append(value)
 
-    if dest is not None:
-        export_to_file(captured, dest)
-
     return captured
 
 import json
 
 
-def export_to_file(content, filename):
-    with open(filename, 'w+') as f:
-        f.write(json.dumps(content, indent=2))
+def export_to_file(func):
+    def func_wrapper(spec, metrics, dest=None):
+        content = func(spec, metrics)
+        if dest is not None:
+            with open(dest, 'w+') as f:
+                f.write(json.dumps(content, indent=2))
+        return content
+    return func_wrapper