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}