diff --git a/src/main/java/com/samskivert/mustache/BasicCollector.java b/src/main/java/com/samskivert/mustache/BasicCollector.java index 278ea35..4f771fe 100644 --- a/src/main/java/com/samskivert/mustache/BasicCollector.java +++ b/src/main/java/com/samskivert/mustache/BasicCollector.java @@ -23,14 +23,14 @@ public class BasicCollector implements Mustache.Collector } @Override - public Mustache.VariableFetcher createFetcher (Class cclass, String name) + public Mustache.VariableFetcher createFetcher (Object ctx, String name) { // support both .name and this.name to fetch members if (name == Template.DOT_NAME || name == Template.THIS_NAME) { return THIS_FETCHER; } - if (Map.class.isAssignableFrom(cclass)) { + if (ctx instanceof Map) { return MAP_FETCHER; } diff --git a/src/main/java/com/samskivert/mustache/DefaultCollector.java b/src/main/java/com/samskivert/mustache/DefaultCollector.java index 078de3a..eef462d 100644 --- a/src/main/java/com/samskivert/mustache/DefaultCollector.java +++ b/src/main/java/com/samskivert/mustache/DefaultCollector.java @@ -34,11 +34,12 @@ public class DefaultCollector extends BasicCollector } @Override - public Mustache.VariableFetcher createFetcher (Class cclass, String name) + public Mustache.VariableFetcher createFetcher (Object ctx, String name) { - Mustache.VariableFetcher fetcher = super.createFetcher(cclass, name); + Mustache.VariableFetcher fetcher = super.createFetcher(ctx, name); if (fetcher != null) return fetcher; + Class cclass = ctx.getClass(); final Method m = getMethod(cclass, name); if (m != null) { return new Mustache.VariableFetcher() { diff --git a/src/main/java/com/samskivert/mustache/Mustache.java b/src/main/java/com/samskivert/mustache/Mustache.java index d935b13..57cc278 100644 --- a/src/main/java/com/samskivert/mustache/Mustache.java +++ b/src/main/java/com/samskivert/mustache/Mustache.java @@ -144,8 +144,10 @@ public class Mustache * not a collection. */ Iterator toIterator (final Object value); - /** Creates a fetcher for a so-named variable on instances of the given class. */ - VariableFetcher createFetcher (Class cclass, String name); + /** Creates a fetcher for a so-named variable in the supplied context object, which will + * never be null. The fetcher will be cached and reused for future contexts for which + * {@code octx.getClass().equals(nctx.getClass()}. */ + VariableFetcher createFetcher (Object ctx, String name); } /** diff --git a/src/main/java/com/samskivert/mustache/Template.java b/src/main/java/com/samskivert/mustache/Template.java index 4ca8e5b..182e8cf 100644 --- a/src/main/java/com/samskivert/mustache/Template.java +++ b/src/main/java/com/samskivert/mustache/Template.java @@ -186,10 +186,10 @@ public class Template return fetcher.get(data, name); } catch (Exception e) { // zoiks! non-monomorphic call site, update the cache and try again - fetcher = _compiler.collector.createFetcher(key.cclass, key.name); + fetcher = _compiler.collector.createFetcher(data, key.name); } } else { - fetcher = _compiler.collector.createFetcher(key.cclass, key.name); + fetcher = _compiler.collector.createFetcher(data, key.name); } // if we were unable to create a fetcher, just return null and our caller can either try