// 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.

// @dart = 2.5

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> {
  /**
   * 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";

  /**
   * 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);
}
