### Question:
HashObjectFunnels { public static Funnel<RevFeatureType> featureTypeFunnel() { return FeatureTypeFunnel.INSTANCE; }  static Funnel<RevCommit> commitFunnel(); static Funnel<RevTree> treeFunnel(); static Funnel<Object> valueFunnel(); static Funnel<RevFeature> featureFunnel(); static Funnel<RevTag> tagFunnel(); static Funnel<RevFeatureType> featureTypeFunnel(); static void feature(@NonNull PrimitiveSink into, @NonNull List<Object> values); static void tree(@NonNull PrimitiveSink into, @NonNull List<Node> trees,
            @NonNull List<Node> features, @NonNull Iterable<Bucket> buckets); static ObjectId hashTag(@NonNull String name, @NonNull ObjectId commitId,
            @NonNull String message, @NonNull RevPerson tagger); static ObjectId hashFeature(@NonNull List<Object> values); static ObjectId hashCommit(@NonNull ObjectId treeId, @NonNull List<ObjectId> parentIds,
            @NonNull RevPerson author, @NonNull RevPerson committer,
            @NonNull String commitMessage); static ObjectId hashFeatureType(@NonNull FeatureType featureType); static ObjectId hashTree(@Nullable List<Node> trees, @Nullable List<Node> features,
            @Nullable Iterable<Bucket> buckets); static ObjectId hashValue(@Nullable Object value); static ObjectId hashObject(@NonNull RevObject o); static void tag(@NonNull PrimitiveSink into, @NonNull String name,
            @NonNull ObjectId commitId, @NonNull String message, @NonNull RevPerson tagger); static void featureType(@NonNull PrimitiveSink into, @NonNull FeatureType featureType); static void commit(@NonNull PrimitiveSink into, @NonNull ObjectId treeId,
            @NonNull List<ObjectId> parentIds, @NonNull RevPerson author,
            @NonNull RevPerson committer, @NonNull String commitMessage);  }### Answer:
@Test public void testFeatureTypeFunnel() { FeatureType featureType = FeatureTypes.createType("http: "sp:String", "ip:Integer", "pp:Point:srid=4326"); RevFeatureType testFeatureType = new RevFeatureType() { public @Override TYPE getType() { return RevObject.TYPE.FEATURETYPE; } public @Override ObjectId getId() { return oid1; } public @Override FeatureType type() { return featureType; } public @Override List<PropertyDescriptor> descriptors() { return ImmutableList.copyOf(featureType.getDescriptors()); } public @Override Name getName() { return Name.valueOf("http: } }; Funnel<RevFeatureType> featureTypeFunnel = HashObjectFunnels.featureTypeFunnel(); Hasher hasher = ObjectId.HASH_FUNCTION.newHasher(); featureTypeFunnel.funnel(testFeatureType, hasher); byte[] rawKey = hasher.hash().asBytes(); assertEquals(ObjectId.NUM_BYTES, rawKey.length); }