    //@include lib_sol.common.Instance.js

    /**
     * @class sol.common.instance.sord
     * @extends sol.common.instance.base
     * @eloall
     * @experimental
     * Provides a stores for all kind of properties.
     * A store can be accessed by name. The name is a required config property.
     *
     * Extend from this instance with care (only if you know what you do).
     *
     * It is recommended to create a store with mixin "sol.common.instance.mixins.create" and to use instances name ($name)
     * as store name to just share a store with members of the same instanceDefinition.
     *
     * Every instance can share a store with every other instance, it just needs to access the same store by the same name.
     *
     * E.g.
     * @example
     * sol.define("businesspartner.common.example.myInstance", {
     *  $create: [
     *    { key: "myStore", name: "sol.common.instance.store", config: { name: "{{instance.$name}}" } }
     *  ],
     *  mixins: [
     *    "sol.common.instance.required",
     *    "sol.common.instance.mixins.create"
     *  ]
     * });
     *
     * var myInstance1 = so.create("businesspartner.common.example.myInstance", {}),
     *     myInstance2 = so.create("businesspartner.common.example.myInstance", {});
     * myInstance1.myStore.set("myProperty", "myValue");
     * myInstance2.myStore.get("myProperty"); // returns "myValue";
     *
     * @example
     * sol.define("businesspartner.common.example.myInstance", {
     *  $create: [
     *    { key: "myStore", name: "sol.common.instance.store", config: { name: "myInternalStoreName" } }
     *  ],
     *  mixins: [
     *    "sol.common.instance.required",
     *    "sol.common.instance.mixins.create"
     *  ]
     * });
     * sol.define("businesspartner.common.example.myOtherInstance", {
     *  $create: [
     *    { key: "myStore", name: "sol.common.instance.store", config: { name: "myInternalStoreName" } }
     *  ],
     *  mixins: [
     *    "sol.common.instance.required",
     *    "sol.common.instance.mixins.create"
     *  ]
     * });
     *
     * var module1 = so.create("businesspartner.common.example.myInstance", {}),
     *     module2 = so.create("businesspartner.common.example.myOtherInstance", {});
     * module1.myStore.set("myProperty", "myValue");
     * module2.myStore.get("myProperty"); // return "myValue";
     *
     * @requires sol.common.instance
     */
    sol.common.instance.define("sol.common.instance.store", {
      constructor: {
        prototype: {
          // properties within constructor cache behave like properties created with sol.create
          // use with care, all instances using store (via mixin or as extend) share
          $stores: {}
        }
      },
      $create: [
        { key: "logger", name: "sol.common.instance.logger", config: { scope: "{{instance.$name}}" } },
        { name: "sol.common.instance.required", config: { requiredConfig: ["name"], name: "{{config.name}}" } }

      ],
      mixins: [
        "sol.common.instance.mixins.create"
      ],
      initialize: function (config) {
        var me = this;
        if (config.name) {
          me.name = config.name;
          me.$stores[config.name] = {};
        }
      },
      set: function (key, value) {
        var me = this;
        me.$stores[me.name][key] = value;
      },
      get: function (key) {
        var me = this;
        return me.$stores[me.name][key];
      },
      delete: function (key) {
        var me = this;

        delete me.$stores[me.name][key];
      }
    });