enhanced constructor