interface Efl.Gfx.Stack {
   legacy_prefix: null;
   methods {
      @property layer {
         set {
            [[Sets the layer of its canvas that the given object will be part of.

              If you don't use this function, you'll be dealing with an unique
              layer of objects, the default one. Additional layers are handy when
              you don't want a set of objects to interfere with another set with
              regard to stacking. Two layers are completely disjoint in that
              matter.

              This is a low-level function, which you'd be using when something
              should be always on top, for example.

              Warning: Be careful, it doesn't make sense to change the layer of
              smart objects' children. Smart objects have a layer of their own,
              which should contain all their children objects.

              See also @.layer.get()]]
         }
         get {
            [[Retrieves the layer of its canvas that the given object is part of.

              See also @.layer.set()]]
         }
         values {
            l: short; [[The number of the layer to place the object on.
                        Must be between #EVAS_LAYER_MIN and #EVAS_LAYER_MAX.]]
         }
      }
      @property below {
         get {
            [[Get the Evas object stacked right below $obj

              This function will traverse layers in its search, if there are
              objects on layers below the one $obj is placed at.

              See also @.layer.get(), @.layer.set() and @.below.get()]]
            return: Efl.Gfx.Stack * @warn_unused; [[the #Efl_Gfx_Stack directly below $obj, if any,
                                                    or $null, if none]]
         }
      }
      @property above {
         get {
            [[Get the Evas object stacked right above $obj

              This function will traverse layers in its search, if there are
              objects on layers above the one $obj is placed at.

              See also @.layer.get(), @.layer.set() and @.below.get()]]
            return: Efl.Gfx.Stack * @warn_unused; [[the #Efl_Gfx_Stack directly below $obj, if any,
                                                    or $null, if none]]
         }
      }
      stack_below {
         [[Stack $obj immediately $below

           Objects, in a given canvas, are stacked in the order they get added
           to it.  This means that, if they overlap, the highest ones will
           cover the lowest ones, in that order. This function is a way to
           change the stacking order for the objects.

           This function is intended to be used with objects belonging to
           the same layer in a given canvas, otherwise it will fail (and
           accomplish nothing).

           If you have smart objects on your canvas and $obj is a member of
           one of them, then $below must also be a member of the same
           smart object.

           Similarly, if $obj is not a member of a smart object, $below
           must not be either.

           See also @.layer.get(), @.layer.set() and @.stack_below()]]

         params {
            @in below: Efl.Gfx.Stack * @nonull; [[the object below which to stack]]
         }
      }
      raise {
         [[Raise $obj to the top of its layer.

           $obj will, then, be the highest one in the layer it belongs
           to. Object on other layers won't get touched.

           See also @.stack_above(), @.stack_below() and @.lower()]]

      }
      stack_above {
         [[Stack $obj immediately $above

           Objects, in a given canvas, are stacked in the order they get added
           to it.  This means that, if they overlap, the highest ones will
           cover the lowest ones, in that order. This function is a way to
           change the stacking order for the objects.

           This function is intended to be used with objects belonging to
           the same layer in a given canvas, otherwise it will fail (and
           accomplish nothing).

           If you have smart objects on your canvas and $obj is a member of
           one of them, then $above must also be a member of the same
           smart object.

           Similarly, if $obj is not a member of a smart object, $above
           must not be either.

           See also @.layer.get(), @.layer.set() and @.stack_below()]]

         params {
            @in above: Efl.Gfx.Stack * @nonull; [[the object above which to stack]]
         }
      }
      lower {
         [[Lower $obj to the bottom of its layer.

           $obj will, then, be the lowest one in the layer it belongs
           to. Objects on other layers won't get touched.

           See also @.stack_above(), @.stack_below() and @.raise() ]]

      }
   }
}
