code: public final <T extends Storable> Filter<T> asJoinedFrom(ChainedProperty<T> joinProperty) {
          if (joinProperty.getType() != getStorableType()) {
              throw new IllegalArgumentException
                  ("Property is not of type \"" + getStorableType().getName() + "\": " +
                   joinProperty);
          }
          return asJoinedFromAny(joinProperty);
      }
docs: Prepends a join property to all properties of this filter. For example,
  consider two Storable types, Person and Address. Person has a property
  "homeAddress" which joins to Address. An Address filter, "city = ?", as
  joined from Person's "homeAddress", becomes "homeAddress.city = ?".
  
  @param joinProperty property of T which joins to this Filter's Storable type
  @return filter for type T
  @throws IllegalArgumentException if property is not a join to type S