}
    public String toString()    {	String saveSpaces = spaces;	spaces += "  ";	String myString = "";	Object value = null;		// Debug.out("Cop: tS " + target.getClass().getName());	PropertyDescriptor[] properties = BeanInfoProvider.getProperties(target.getClass());	for ( int i = 0; i < properties.length; i++ ) {	    try {		Method readMethod = properties[i].getReadMethod();		if ( readMethod == null ) {		    OutputHandler.out("CI:tS Warning: no read method for " + properties[i].getName());		    continue;		}		value = readMethod.invoke(target, null);	    }	    catch ( IllegalAccessException e ) {		OutputHandler.out(ExceptionTools.toString("CI:tS", e));	    }	    catch ( InvocationTargetException e ) {		OutputHandler.out(ExceptionTools.toString("CI:tS", e));	    }	    if ( value == null )		myString += spaces + properties[i].getName() + ": [null]\n";	    else // if ( properties[i].getWriteMethod() != null )		if ( properties[i].getPropertyType().isArray() ) {		    int length = java.lang.reflect.Array.getLength(value);		    if ( length == 0 )			myString += spaces + properties[i].getName() + ": [none]\n";		    else {			myString += spaces + properties[i].getName() + ":\n";			for ( int j = 0; j < length; j++ ) {			    Object element = java.lang.reflect.Array.get(value, j);			    if ( element instanceof Copiable )				myString += element.toString();			    else				myString += spaces + "  " + element.toString() + "\n";			}		    }		}		else {		    myString += spaces + properties[i].getName() + ": ";		    if ( value instanceof Copiable )			myString += "\n" + value;		    else			myString += value + "\n";		}	}	spaces = saveSpaces;	return myString;    }