/* ---------------------------------------------------------------- */
/*  An .Array mixinclass to restrict membership of an inheriting    */
/*  class, which should be an .Array itself or a subclass of .Array */
/*                                                                  */
/*  Note: Check if the mixinclass could be for OrderedCollection.   */
/*                                                                  */
/*  The inheriting class has to only implement an "isAllowed"       */
/*  method, that returns .true if allowed and .false if denied.     */
/*                                                                  */
/* ---------------------------------------------------------------- */
/*                                                                  */
/* Originally by Ruurd J. Idenburg                                  */
/*                                                                  */
/* No copyright, no licence, no guarantees or warrantees, be it     */
/* explicit, implicit or whatever. Usage is totally and completely  */
/* at the users own risk, the author shall not be liable for any    */
/* damages whatsoever, for any reason whatsoever.                   */
/*                                                                  */
/* Please keep this comment block intact when modifying this code   */
/* and add a note with date and a description.                      */
/*                                                                  */
/* ---------------------------------------------------------------- */
/* 2014/01/26 - Initial version approximately                       */
/* ---------------------------------------------------------------- */

::class restrictable public mixinclass array
-- I think I covered all the "set" methods
::method "[]="
  self~checkIt("[]=",arg(1,'A'))

::method append
  self~checkIt(append,arg(1,'A'))

::method appendAll
  self~checkIt(appendAll,arg(1,'A'))

::method fill
  self~checkIt(fill,arg(1,'A'))

::method insert
  self~checkIt(insert,arg(1,'A'))

::method put
  self~checkIt(put,arg(1,'A'))

::method checkIt private
  use arg msg                 -- argument 1 is the original method invoked
  item = arg(2)[1]            -- argument 2 is an array of original arguments
  if \self~isAllowed(item)    -- the potential member is the first item in the args array
    then raise syntax 93.900 array(self~syntaxMsg(item)) 
  forward class (super) message(msg) arguments (arg(2)) -- forward original method and args

::method syntaxMsg private
  use arg object
  msg = 'The "'self~class~id'" class does not allow a "'object~class~id'" object as a collection member'
  return msg

