module Rails::Generators::AppName

def app_const

def app_const
  @app_const ||= "#{app_const_base}::Application"
end

def app_const_base

def app_const_base
  @app_const_base ||= defined_app_const_base || app_name.gsub(/\W/, "_").squeeze("_").camelize
end

def app_name

def app_name
  @app_name ||= original_app_name.tr("\\", "").tr("-. ", "_")
end

def defined_app_const_base

def defined_app_const_base
  Rails.respond_to?(:application) && defined?(Rails::Application) &&
    Rails.application.is_a?(Rails::Application) && Rails.application.class.name.chomp("::Application")
end

def defined_app_name

def defined_app_name
  defined_app_const_base.underscore
end

def original_app_name

def original_app_name
  @original_app_name ||= defined_app_const_base? ? defined_app_name : File.basename(destination_root)
end

def valid_const?

def valid_const?
  if /^\d/.match?(app_const)
    raise Error, "Invalid application name #{original_app_name}. Please give a name which does not start with numbers."
  elsif RESERVED_NAMES.include?(original_app_name)
    raise Error, "Invalid application name #{original_app_name}. Please give a " \
                 "name which does not match one of the reserved rails " \
                 "words: #{RESERVED_NAMES.join(", ")}"
  elsif Object.const_defined?(app_const_base)
    raise Error, "Invalid application name #{original_app_name}, constant #{app_const_base} is already in use. Please choose another application name."
  end
end