// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

part of dart.core;

/**
 * An [Expando] allows adding new properties to objects.
 *
 * Does not work on numbers, strings, booleans or `null`.
 *
 * An `Expando` does not hold on to the added property value after an object
 * becomes inaccessible.
 *
 * Since you can always create a new number that is identical to an existing
 * number, it means that an expando property on a number could never be
 * released. To avoid this, expando properties cannot be added to numbers.
 * The same argument applies to strings, booleans and `null`, which also have
 * literals that evaluate to identical values when they occur more than once.
 *
 * There is no restriction on other classes, even for compile time constant
 * objects. Be careful if adding expando properties to compile time constants,
 * since they will stay alive forever.
 */
class Expando<T extends Object> {
  /**
   * The name of the this [Expando] as passed to the constructor. If
   * no name was passed to the constructor, the name is `null`.
   */
  final String? name;

  /**
   * Creates a new [Expando]. The optional name is only used for
   * debugging purposes and creating two different [Expando]s with the
   * same name yields two [Expando]s that work on different properties
   * of the objects they are used on.
   */
  external Expando([String? name]);

  /**
   * Expando toString method override.
   */
  String toString() => "Expando:${name.toString()}";

  /**
   * Gets the value of this [Expando]'s property on the given
   * object. If the object hasn't been expanded, the method returns
   * `null`.
   *
   * The object must not be a number, a string, a boolean or null.
   */
  external T? operator [](Object object);

  /**
   * Sets the value of this [Expando]'s property on the given
   * object. Properties can effectively be removed again by setting
   * their value to null.
   *
   * The object must not be a number, a string, a boolean or null.
   */
  external void operator []=(Object object, T? value);
}
