This paper presents an architecture enabling developers to easily and flexibly assign replication protocols simply by annotating individual server methods. This avoids using costly replication protocols for all object methods, e.g. read-only methods can use less costly protocols, reserving the costly replication protocols for update methods. The architecture has been implemented in the Jgroup/ARM middleware, and enables addition of new replication protocols without modifying the core toolkit. It also supports runtime selection of replication protocol for individual methods. This can be used to support self-optimization of protocol selection by optimizing for the most appropriate configuration under a given system load.