Here is a proposal to reduce all get...Block to 2 methods which support matching any Block. interface Block { enum TraversalStrategy { /** Search in parents **/ PARENT, /** Search in children **/ CHILD, /** Search recursively in children (and children of children etc...) **/ CHILDRECURSE, /** Search in previous siblings **/ PREVIOUS, /** Search recursively in previous siblings (and parent previous sibling etc...) **/ PREVIOUSRECURSE, /** Search in next siblings**/ NEXT, /** Search recursively in next siblings (and children etc...)**/ NEXTRECURSE } [...] List<Block> getBlocks(BlockMatcher matcher, TraversalStrategy traversalStrategy, boolean recurse); Block getFirstBlock(BlockMatcher matcher, TraversalStrategy traversalStrategy, boolean recurse); } interface BlockMatcher { boolean match(Block block); } et on refactor tous les autres get*Block basé sur ceux la avec des BlockMatcher prédéfinis (ClassBlockMatcher, MetaDataBlockMatcher, etc...). Note: the main use case for this change is to support MetaData search. WDYT (especially on the vocabulary like "TraversalStrategy") ? -- Thomas Mortagne