// Path: src/main/java/comeon/model/Template.java
// public class Template {
//     private final String name;
// 
//     private final String description;
// 
//     private final Path file;
// 
//     private final Charset charset;
// 
//     private String templateText;
// 
//     private final TemplateKind kind;
// 
//     public Template(final String name, final String description, final Path file, final Charset charset,
//                     final TemplateKind kind) throws IOException {
//         this.name = name;
//         this.description = description;
//         this.file = file;
//         this.charset = charset;
//         this.kind = kind;
//         this.load();
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public String getDescription() {
//         return description;
//     }
// 
//     public Path getFile() {
//         return file;
//     }
// 
//     public Charset getCharset() {
//         return charset;
//     }
// 
//     public String getTemplateText() {
//         return templateText;
//     }
// 
//     public TemplateKind getKind() {
//         return kind;
//     }
// 
//     public void load() throws IOException {
//         try (final BufferedReader reader = Files.newBufferedReader(file, charset)) {
//             final StringBuilder buffer = new StringBuilder((int) Files.size(file));
//             String line;
//             while ((line = reader.readLine()) != null) {
//                 buffer.append(line);
//                 buffer.append('\n');
//             }
//             this.templateText = buffer.toString();
//         }
//     }
// 
//     @Override
//     public String toString() {
//         return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
//                 .append("name", name)
//                 .append("file", file)
//                 .append("charset", charset)
//                 .append("kind", kind)
//                 .toString();
//     }
// }
// 
// Path: src/main/java/comeon/model/TemplateKind.java
// public interface TemplateKind {
//     String render(Template template, String templateText, User user, Media media);
// }
// 
// Path: src/main/java/comeon/ui/preferences/Model.java
// public interface Model extends Cloneable {
// 
//     void addPropertyChangeListener(final PropertyChangeListener pcl);
// 
//     void removePropertyChangeListener(final PropertyChangeListener pcl);
// 
//     Object clone() throws CloneNotSupportedException;
// }


import com.google.common.base.Strings;
import comeon.model.Template;
import comeon.model.TemplateKind;
import comeon.ui.preferences.Model;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Path;
package comeon.ui.preferences.templates;



public final class TemplateModel implements Model {
    private final PropertyChangeSupport pcs;

    private String name;

    private String description;

    private Path file;

    private Charset charset;

    private TemplateKind kind;

// Path: src/main/java/comeon/model/Template.java
// public class Template {
//     private final String name;
// 
//     private final String description;
// 
//     private final Path file;
// 
//     private final Charset charset;
// 
//     private String templateText;
// 
//     private final TemplateKind kind;
// 
//     public Template(final String name, final String description, final Path file, final Charset charset,
//                     final TemplateKind kind) throws IOException {
//         this.name = name;
//         this.description = description;
//         this.file = file;
//         this.charset = charset;
//         this.kind = kind;
//         this.load();
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public String getDescription() {
//         return description;
//     }
// 
//     public Path getFile() {
//         return file;
//     }
// 
//     public Charset getCharset() {
//         return charset;
//     }
// 
//     public String getTemplateText() {
//         return templateText;
//     }
// 
//     public TemplateKind getKind() {
//         return kind;
//     }
// 
//     public void load() throws IOException {
//         try (final BufferedReader reader = Files.newBufferedReader(file, charset)) {
//             final StringBuilder buffer = new StringBuilder((int) Files.size(file));
//             String line;
//             while ((line = reader.readLine()) != null) {
//                 buffer.append(line);
//                 buffer.append('\n');
//             }
//             this.templateText = buffer.toString();
//         }
//     }
// 
//     @Override
//     public String toString() {
//         return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
//                 .append("name", name)
//                 .append("file", file)
//                 .append("charset", charset)
//                 .append("kind", kind)
//                 .toString();
//     }
// }
// 
// Path: src/main/java/comeon/model/TemplateKind.java
// public interface TemplateKind {
//     String render(Template template, String templateText, User user, Media media);
// }
// 
// Path: src/main/java/comeon/ui/preferences/Model.java
// public interface Model extends Cloneable {
// 
//     void addPropertyChangeListener(final PropertyChangeListener pcl);
// 
//     void removePropertyChangeListener(final PropertyChangeListener pcl);
// 
//     Object clone() throws CloneNotSupportedException;
// }


// Path: src/main/java/comeon/ui/preferences/templates/TemplateModel.java
import com.google.common.base.Strings;
import comeon.model.Template;
import comeon.model.TemplateKind;
import comeon.ui.preferences.Model;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Path;

package comeon.ui.preferences.templates;



public final class TemplateModel implements Model {
    private final PropertyChangeSupport pcs;

    private String name;

    private String description;

    private Path file;

    private Charset charset;

    private TemplateKind kind;

    public enum Properties {