class Variable(object): def __init__(self, name): self.name = name def __lshift__(self, value): return Assignment(self, value) def __str__(self): result = self.name return result def __repr__(self): return 'Variable: %s' % self def __getattr__(self, name): if name.startswith('__') or name.endswith('__'): raise AttributeError return Variable('.'.join([self.name, name])) def __call__(self, *args): return FuncCall(self, *args) class FuncCall(object): def __init__(self, name, *args): self.name = str(name) self.args = ', '.join(str(x) for x in args) def __repr__(self): return 'FuncCall: %s(%s)' % (self.name, self.args) def __str__(self): return '%s(%s)' % (self.name, self.args) class Expression(object): def __init__(self, expr): self.expr = expr def __repr__(self): return 'Expression: %s' % self.expr def __rshift__(self, args): if not hasattr(args, '__iter__'): args = (args,) return self.apply(*args) def apply(self, *args): return self.expr % args class Assignment(object): template = 'var %s = %s' def __init__(self, name, value): self.name = name self.value = value def __repr__(self): return 'Assignment: %s, %s' % (self.name, self.value) def __str__(self): return self.template % (self.name, self.value) class Return(object): template = 'return %s' def __init__(self, var): self.var = var def __str__(self): return self.template % self.var def __repr__(self): return 'Return: %s' % self class Block(object): template = '{\n%s\n}' def __init__(self, *lines): self.lines = lines def __repr__(self): return 'Block: %d lines' % len(self.lines) def __str__(self): return self.template % ';\n'.join(str(x) for x in self.lines) class Closure(object): template = '''function(%s)''' def __init__(self, args, *code): self.args = ', '.join(str(x) for x in args) self.code = Block(*code) def __str__(self): out = ['(', self.template % self.args, str(self.code), ')' ] return '\n'.join(out) def __repr__(self): return 'Closure: %s' % (self.template % self.args) def __call__(self, *args): return FuncCall(self, *args) class Field(object): template = '''%s: %s''' def __init__(self, name, closure): self.name = name self.closure = closure def __repr__(self): return 'Method: %s' % self.name def __str__(self): return self.template % (self.name, self.closure) class Object(object): template = '''{\n%s\n}''' def __init__(self, *methods): self.methods = methods def __repr__(self): return 'Object at %x: %d methods' % (id(self), len(self.methods)) def __str__(self): methods = ',\n'.join(str(x) for x in self.methods) return self.template % methods widg = Variable('widg') jq = Variable('$') this = Variable('this') arguments = Variable('arguments') print Closure((jq,), widg << jq.widget('"ui.captionator"', Object( Field('options', Object()), Field('_create', Closure(())), Field('destroy', Closure(())), Field('_setOption', Closure(('option', 'value'), jq.Widget.prototype._setOption.apply( this, arguments ) )) )), Return(widg) )('jQuery')