class Monitors {

    public <T> T newMonitor( Class<T> monitorClass, String... tags )
    {
        requireInterface( monitorClass );
        ClassLoader classLoader = monitorClass.getClassLoader();
        MonitorInvocationHandler monitorInvocationHandler = new MonitorInvocationHandler( this, tags );
        return monitorClass.cast( Proxy.newProxyInstance( classLoader, new Class<?>[]{monitorClass}, monitorInvocationHandler ) );
    }

    public  Monitors();
    public  Monitors( Monitors parent );

}