This is not as simple as you're making it out to be, unfortunately. I started to make this work in another branch, but ran into some serious problems in edge cases. If the interface extends multiple entities, for instance, how do you know which one to select? This can't be done generically without adding an extra parameter, I don't think. You also need the desired entity class, in the case that the entity implements multiple interfaces, e.g. if BukkitEntityA implements EntityA, EntityB, what if we desire to view it as an EntityB? You need to be able to specify that. In the current cases we're using, there is no ambiguity, so there is no need for this at present (especially since order is manually defined) but when you expand this out generically, you need to be prepared to deal with that type of case as well. Additionally, I'm not a big fan of limiting it to entities only in one package, as you're doing here, you can use the ClassDiscovery methods (ClassDiscovery.getClassesThatExtend) to get a comprehensive, package independent list of candidates. Given all the caching that is done, it will be nearly as efficient as this anyways.

Having said all this, this is a MASSIVE commit, so let's discuss the rest of this on IRC, shall we?