class JavadocTagBase implements JavadocTag {

    private String name;
    private String value;
    private String text;
    private final List<Import> imports;

    JavadocTagBase(String name) {
        this.name    = requireNonNull(name);
        this.value   = null;
        this.text    = null;
        this.imports = new ArrayList<>();
    }

    JavadocTagBase(String name, String text) {
        this.name    = requireNonNull(name);
        this.value   = null;
        this.text    = text;
        this.imports = new ArrayList<>();
    }

    JavadocTagBase(String name, String value, String text) {
        this.name    = requireNonNull(name);
        this.value   = value;
        this.text    = text;
        this.imports = new ArrayList<>();
    }

    JavadocTagBase(JavadocTag prototype) {
        requireNonNull(prototype);
        this.name    = prototype.getName();
        this.value   = prototype.getValue().orElse(null);
        this.text    = prototype.getText().orElse(null);
        this.imports = Copier.copy(prototype.getImports());
    }

    @Override
    public Optional<String> getValue() {
        return Optional.ofNullable(value);
    }

    @Override
    public JavadocTag setValue(String value) {
        this.value = value;
        return this;
    }

    @Override
    public List<Import> getImports() {
        return imports;
    }

    @Override
    public Optional<String> getText() {
        return Optional.ofNullable(text);
    }

    @Override
    public JavadocTag setText(String text) {
        this.text = text;
        return this;
    }

    @Override
    public JavadocTag setName(String name) {
        this.name = requireNonNull(name);
        return this;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public JavadocTagImpl copy() {
        return new JavadocTagImpl(this);
    }

    @Override
    public int hashCode() {<FILL_FUNCTION_BODY>}

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final JavadocTagBase other = (JavadocTagBase) obj;
        if (!Objects.equals(this.name, other.name)) {
            return false;
        }
        if (!Objects.equals(this.value, other.value)) {
            return false;
        }
        if (!Objects.equals(this.imports, other.imports)) {
            return false;
        }
        return Objects.equals(this.text, other.text);
    }

}

        int hash = 3;
        hash = 67 * hash + Objects.hashCode(this.name);
        hash = 67 * hash + Objects.hashCode(this.value);
        hash = 67 * hash + Objects.hashCode(this.text);
        hash = 67 * hash + Objects.hashCode(this.imports);
        return hash;
    
<no_super_class>