use error() instead of croak()