public LeoClass(Leola runtime
				  , Scope scope
				  , ClassDefinition classDefinition
				  , LeoObject superClass
				  , LeoObject[] params) {
		super(LeoType.CLASS, scope, classDefinition.getBody().numOuters);
			
		this.runtime = runtime;
		
		this.superClass = superClass;
		this.className = classDefinition.getClassName();
		this.constructor = classDefinition.getBody();
		this.paramNames = classDefinition.getParameterNames();
		this.outers = classDefinition.getOuters();
				
		putObject("super", superClass);
		putObject("this", this);
				
		if ( paramNames != null ) {
			for(int i = 0; i < paramNames.length; i++) {
				if ( params == null || params.length <= i ) {
					addProperty(paramNames[i], LeoNull.LEONULL);
				}
				else {
					addProperty(paramNames[i], params[i]);	
				}
			}
		}
		
		/**
		 * The constructor may be an empty body, if it is,
		 * no need to construct anything.
		 * 
		 * A class is empty if define as such:
		 * class X();
		 * class X() {}
		 * 
		 * The former actually produces a bytecode of LOAD_NULL, which
		 * we have to also check.
		 */
		boolean isEmpty = this.constructor.len < 1 || 
		                    (this.constructor.len < 2 && 
		                     Opcodes.OPCODE(this.constructor.instr[0]) == Opcodes.LOAD_NULL);
		if(!isEmpty) {
		    this.runtime.execute(this, this.constructor);
		}
		
	}