def METHOD_NAME(self, d):
    data = {}
    directory = dir(self.implementation)
    for attribute in directory:
        if attribute.startswith("V_"):
            key = attribute.replace("V_", "")
            data[key] = getattr(self.implementation, attribute)(d)
    if not os.path.isdir(self.ops.output_dir):
        os.makedirs(ops.output_dir)
    basename = "version-%s" % (d['product']['id'].lower())
    if 'build_config' in d:
        basename += "-%s" % d['build_config']
    # JSON
    fname = os.path.join(self.ops.output_dir, basename + '.json')
    if not os.path.exists(fname) or self.ops.force:
        with open(fname, "w") as f:
            json.dump(data, f, indent=2)
    # YAML
    fname = os.path.join(self.ops.output_dir, basename + '.yml')
    if not os.path.exists(fname) or self.ops.force:
        with open(fname, "w") as f:
            yaml.dump(data, f, default_flow_style=False)
    # mk
    fname = os.path.join(self.ops.output_dir, basename + '.mk')
    if not os.path.exists(fname) or self.ops.force:
        with open(fname, "w") as f:
            for k in sorted(data.keys()):
                f.write("%s%s=%s\n" % ("export " if self.ops.export else "", k, data[k]))
            f.write("\n")
    # sh
    fname = os.path.join(self.ops.output_dir, basename + '.sh')
    if not os.path.exists(fname) or self.ops.force:
        with open(fname, "w") as f:
            for k in sorted(data.keys()):
                f.write("%s%s='%s'\n" % ("export " if self.ops.export else "", k, data[k]))
            f.write("\n")
    if self.ops.print_:
        pprint.pprint(data, indent=2)