note
   description: "[
      SHAPE extended with convexity query and a mutable position in space.
      Due to once("object") there is one-to-one relation between
      any SHAPE object, and an EXTENDED_SHAPE object.
      So not only we can externally add new features to an object, but
      also object attributes (position in this example).
   ]"
   author: "Miguel Oliveira e Silva"
   date: "2024-02-13"

once("object") class EXTENDED_SHAPE(s: SHAPE)

inherit
   SHAPE
      redefine default_create, out end

feature

   default_create
      do
         create position.make(0,0) -- default position in space
      end

   perimeter: REAL_64
      do
         Result := s.perimeter
      end

   out: STRING
      do
         Result := "["+generator+"]: "+s.out + ", " + "is_convex="+is_convex.out + ", " + "position="+position.out
      end

   is_convex: BOOLEAN
      do
         Result := true --default (redefine if shape might not be convex!)
      end

   position: VECTOR

   move(pos: VECTOR)
      do
         position := position + pos;
      end

end -- EXTENDED_SHAPE