git.fiddlerwoaroof.com
Raw Blame History
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')