class AtomTypeDiff {

    public static IDifference difference(IChemObject first, IChemObject second) {
        if (!(first instanceof IAtomType && second instanceof IAtomType)) {
            return null;
        }
        IAtomType firstElem = (IAtomType) first;
        IAtomType secondElem = (IAtomType) second;
        ChemObjectDifference totalDiff = new ChemObjectDifference("AtomTypeDiff");
        totalDiff.addChild(StringDifference.construct("N", firstElem.getAtomTypeName(), secondElem.getAtomTypeName()));
        totalDiff.addChild(BondOrderDifference.construct("MBO", firstElem.getMaxBondOrder(),
                secondElem.getMaxBondOrder()));
        totalDiff
                .addChild(DoubleDifference.construct("BOS", firstElem.getBondOrderSum(), secondElem.getBondOrderSum()));
        totalDiff
                .addChild(IntegerDifference.construct("FC", firstElem.getFormalCharge(), secondElem.getFormalCharge()));
        totalDiff.addChild(AtomTypeHybridizationDifference.construct("H", firstElem.getHybridization(),
                secondElem.getHybridization()));
        totalDiff.addChild(IntegerDifference.construct("NC", firstElem.getFormalNeighbourCount(),
                secondElem.getFormalNeighbourCount()));
        totalDiff.addChild(DoubleDifference.construct("CR", firstElem.getCovalentRadius(),
                secondElem.getCovalentRadius()));
        totalDiff.addChild(IntegerDifference.construct("V", firstElem.getValency(), secondElem.getValency()));
        totalDiff.addChild(IsotopeDiff.difference(first, second));
        if (totalDiff.childCount() > 0) {
            return totalDiff;
        } else {
            return null;
        }
    }

    private  AtomTypeDiff();

}