 represents the current <see cref="Mono.Addins.Addin"/>.
		/// </summary>
		/// <returns>
		/// A <see cref="System.String"/> that represents the current <see cref="Mono.Addins.Addin"/>.
		/// </returns>
		public override string ToString ()
		{
			return Id;
		}
		
		internal AddinInfo AddinInfo {
			get {
				if (addin == null) {
					try {
						addin = AddinInfo.ReadFromDescription (Description);
					} catch (Exception ex) {
						throw new InvalidOperationException ("Could not read add-in file: " + database.GetDescriptionPath (domain, id), ex);
					}
				}
				return addin;
			}
		}
		
		/// <summary>
		/// Gets or sets the enabled status of the add-in.
		/// </summary>
		/// <remarks>
		/// This property can be used to enable or disable an add-in.
		/// The enabled status of an add-in is stored in the add-in registry,
		/// so when an add-in is disabled, it will be disabled for all applications
		/// sharing the same registry.
		/// When an add-in is enabled or disabled, the extension points currently loaded
		/// in memory will be properly updated to include or exclude extensions from the add-in.
		/// </remarks>
		public bool Enabled {
			get {
				if (!IsLatestVersion)
					return false;
				return AddinInfo.IsRoot ? true : database.IsAddinEnabled (Description.Domain, AddinInfo.Id, true);
			}
			set {
				if (value)
					database.EnableAddin (Description.Domain, AddinInfo.Id, true);
				else
					database.DisableAddin (Description.Domain, AddinInfo.Id);
			}
		}
		
		internal bool IsLatestVersion {
			get {
				if (isLatestVersion == null) {
					string id, version;
					Addin.GetIdParts (AddinInfo.Id, out id, out version);
					var addins = database.GetInstalledAddins (null, AddinSearchFlagsInternal.IncludeAll | AddinSearchFlagsInternal.LatestVersionsOnly);
					isLatestVersion = addins.Any (a => Addin.GetIdName (a.Id) == id && a.Version == version);
				}
				return isLatestVersion.Value;
			}
			set {
				isLatestVersion = value;
			}
		}
		
		/// <summary>
		/// Returns 'true' if the add-in is inst