001package org.clafer.ast;
002
003import java.util.ArrayList;
004import java.util.Collections;
005import java.util.List;
006
007/**
008 * An abstract Clafer.
009 *
010 * @author jimmy
011 */
012public class AstAbstractClafer extends AstClafer {
013
014    private final List<AstClafer> subs = new ArrayList<>();
015
016    AstAbstractClafer(String name, AstAbstractClafer claferClafer) {
017        super(name, claferClafer);
018    }
019
020    /**
021     * {@inheritDoc}
022     */
023    @Override
024    public AstAbstractClafer withGroupCard(Card groupCard) {
025        super.withGroupCard(groupCard);
026        return this;
027    }
028
029    /**
030     * {@inheritDoc}
031     */
032    @Override
033    public AstAbstractClafer withGroupCard(int low) {
034        return withGroupCard(new Card(low));
035    }
036
037    /**
038     * {@inheritDoc}
039     */
040    @Override
041    public AstAbstractClafer withGroupCard(int low, int high) {
042        return withGroupCard(new Card(low, high));
043    }
044
045    /**
046     * Returns the Clafers that extend this Clafer
047     *
048     * @return this Clafers subtypes
049     */
050    public List<AstClafer> getSubs() {
051        return Collections.unmodifiableList(subs);
052    }
053
054    void addSub(AstClafer sub) {
055        this.subs.add(sub);
056    }
057
058    void removeSub(AstClafer sub) {
059        this.subs.remove(sub);
060    }
061
062    /**
063     * {@inheritDoc}
064     */
065    @Override
066    public AstAbstractClafer extending(AstAbstractClafer superClafer) {
067        super.extending(superClafer);
068        return this;
069    }
070
071    /**
072     * {@inheritDoc}
073     */
074    @Override
075    public AstAbstractClafer refTo(AstClafer targetType) {
076        super.refTo(targetType);
077        return this;
078    }
079
080    /**
081     * {@inheritDoc}
082     */
083    @Override
084    public AstAbstractClafer refToUnique(AstClafer targetType) {
085        super.refToUnique(targetType);
086        return this;
087    }
088
089    /**
090     * {@inheritDoc}
091     */
092    @Override
093    public String toString() {
094        return "abstract " + getName();
095    }
096}