+
+ public abstract static class ArgumentToString<A> extends AbstractDeclaredStatement<A> {
+ public abstract static class WithSubstatements<A> extends ArgumentToString<A> {
+ private final @NonNull Object substatements;
+
+ protected WithSubstatements(final A argument,
+ final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+ super(argument);
+ this.substatements = maskList(substatements);
+ }
+
+ @Override
+ public final Collection<? extends DeclaredStatement<?>> declaredSubstatements() {
+ return unmaskList(substatements);
+ }
+ }
+
+ private final @NonNull A argument;
+
+ protected ArgumentToString(final A argument) {
+ this.argument = requireNonNull(argument);
+ }
+
+ @Override
+ public final @NonNull A argument() {
+ return argument;
+ }
+
+ @Override
+ public final String rawArgument() {
+ return argument.toString();
+ }
+ }
+
+ public abstract static class WithoutArgument extends AbstractDeclaredStatement<Void> {
+ public abstract static class WithSubstatements extends WithoutArgument {
+ private final @NonNull Object substatements;
+
+ protected WithSubstatements(final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+ this.substatements = maskList(substatements);
+ }
+
+ @Override
+ public final Collection<? extends DeclaredStatement<?>> declaredSubstatements() {
+ return unmaskList(substatements);
+ }
+ }
+
+ @Override
+ public final Void argument() {
+ return null;
+ }
+
+ @Override
+ public final String rawArgument() {
+ return null;
+ }
+ }