code: public ChainedProperty<S> append(ChainedProperty<?> property) {
          if (property == null) {
              throw new IllegalArgumentException();
          }
  
          final int propChainCount = property.getChainCount();
          if (propChainCount == 0) {
              return append(property.getPrimeProperty(), property.isOuterJoin(0));
          }
  
          StorableProperty<?>[] newChain =
              new StorableProperty[getChainCount() + 1 + propChainCount];
  
          int pos = 0;
          if (getChainCount() > 0) {
              System.arraycopy(mChain, 0, newChain, 0, mChain.length);
              pos = mChain.length;
          }
  
          newChain[pos++] = property.getPrimeProperty();
          for (int i=0; i<propChainCount; i++) {
              newChain[pos++] = property.getChainedProperty(i);
          }
  
          boolean[] newOuterJoin = mOuterJoin;
  
          if (property.mOuterJoin != null) {
              newOuterJoin = new boolean[newChain.length + 1];
              if (mOuterJoin != null) {
                  System.arraycopy(mOuterJoin, 0, newOuterJoin, 0, mOuterJoin.length);
              }
              System.arraycopy(property.mOuterJoin, 0,
                               newOuterJoin, getChainCount() + 1,
                               property.mOuterJoin.length);
          }
  
          return get(mPrime, newChain, newOuterJoin);
      }
docs: Returns a new ChainedProperty with another property appended.