public ShippingDetailInfo Execute(ShippingDetailInfo input)
        {
            IZoneDifferenceStrategy zoneDiffDecor = ZoneDifferenceStrategyFactory.GetInstance().GetZoneDifferenceDecoratorInstance(input.DeliveryMethod);
            int zoneDifference = zoneDiffDecor.Difference(input.OriginAddress.PostalCode, input.DestinationAddress.PostalCode);

            switch (input.DeliveryMethod)
            {
            case DeliveryMethodEnum.Air:
                input.Cost = zoneDifference * OunceToPound(Convert.ToDouble(input.PackageInfo.Weight)) * GetPackageVolume(input.PackageInfo);
                break;

            case DeliveryMethodEnum.Rail:
            case DeliveryMethodEnum.Ground:
                input.Cost = zoneDifference * OunceToPound(Convert.ToDouble(input.PackageInfo.Weight));
                break;

            default:
                throw new InvalidOperationException();
            }

            // Insurance Calculation
            if (input.IsInsured)
            {
                input.Cost *= 1.02;
            }

            return(input);
        }