Mercurial > hg > pyloader
diff pyloader/factory.py @ 9:ff634cc2e62b
unfinished sketch of an abstract factory
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Thu, 26 May 2011 18:14:56 -0700 |
parents | |
children | ba2355d57998 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pyloader/factory.py Thu May 26 18:14:56 2011 -0700 @@ -0,0 +1,51 @@ +""" +abstract factories +""" + +import loader + +class CircularReferenceError(Exception): + """factory has detected a circular reference""" + +class PyFactory(object): + + delimeters = ('%(', ')s') + + def __init__(self, config=None, main=''): + self.main = main # main section + self.seen = set() # already seen apps to note cyclic dependencies + self.parsed = {} # instantiated apps + self.load(config or {}) + + def load(self, config, name=None): + name = name or self.main # load main section by default + assert name in config, "'%s' not found in config" + if name in self.parsed: + return self.parsed[name] + if name in self.seen: + raise CircularReferenceError('Circular reference! : %s' % name) + self.seen.add(name) + + # get section + section = config['name'] + assert 'path' in section + + # load object + obj = loader.load(section['path']) + + # interpolate arguments + args = section.get('args', None) + kwargs = section.get('kwargs', None) + if args: + args = [self.iterpolate(arg) for arg in args] + if kwargs: + kwargs = dict([(key, self.interpolate(value)) + for key, value in kwargs.items()]) + + # if args and kwargs aren't there, you're done! + + def interpolate(self, value): + + # only interpolate strings + if not isinstance(value, basestring): + return value