diff --git a/ipalib/plugable.py b/ipalib/plugable.py index 803490908..70743f5a2 100644 --- a/ipalib/plugable.py +++ b/ipalib/plugable.py @@ -289,9 +289,15 @@ class Registrar(object): class API(ReadOnly): - def __init__(self, registrar): + def __init__(self, *allowed): + object.__setattr__(self, 'register', Registrar(*allowed)) object.__setattr__(self, '_API__plugins', []) - for (base, plugins) in registrar: + + def __call__(self): + """ + Finalize the registration, instantiate the plugins. + """ + for (base, plugins) in self.register: ns = NameSpace(self.__plugin_iter(base, plugins)) assert not hasattr(self, base.__name__) object.__setattr__(self, base.__name__, ns) diff --git a/ipalib/tests/test_plugable.py b/ipalib/tests/test_plugable.py index 27841e2e2..2e87ea2c0 100644 --- a/ipalib/tests/test_plugable.py +++ b/ipalib/tests/test_plugable.py @@ -334,7 +334,10 @@ def test_API(): def method(self, n): return n + 1 - r = plugable.Registrar(base0, base1) + api = plugable.API(base0, base1) + r = api.register + assert isinstance(r, plugable.Registrar) + assert read_only(api, 'register') is r class base0_plugin0(base0): pass @@ -360,10 +363,8 @@ def test_API(): pass r(base1_plugin2) - registrants = tuple(r) - # Test API instance: - api = plugable.API(r) + api() # Calling instance performs finalization def get_base(b): return 'base%d' % b