code: public final <T extends Storable> Filter<T> asJoinedFrom(Class<T> type, String joinProperty) {
          return asJoinedFrom
              (ChainedProperty.parse(StorableIntrospector.examine(type), 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 = ?".
  
  <pre>
  Filter&lt;Address&gt; addressFilter = Filter.filterFor(Address.class, "city = ?");
  Filter&lt;Person&gt; personFilter = addressFilter.asJoinedFrom(Person.class, "homeAddress");
  
  // Equivalent filter:
  Filter&lt;Person&gt; personFilter2 = Filter.filterFor(Person.class, "homeAddress.city = ?");
  </pre>
  
  @param type type of T which contains join property
  @param joinProperty property of T which joins to this Filter's Storable type
  @return filter for type T
  @throws IllegalArgumentException if property does not exist or is not a
  join to type S