The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
module Account {

  const long DAILY_MAX = 1000;

  typedef char Face[6][10];
  typedef fixed<16,2> Amount, Amounts[10];
#  typedef long Amount;

  interface AcctCounter {
    long next();
    void destroy();
  };

  interface Account {
    exception InsufficientFunds { Amount overdraft; };
    
    typedef sequence<short> numbers;

    enum Color {
      taupe, burgundy, chartreuse
    };
    struct Preferences {

      Color favorite_color;
      numbers lottery_numbers;
      string nickname;
    };

    enum PrefType {
      pt_color, pt_lotnum, pt_nickname
    };

    union Preference switch (PrefType) {
      case pt_color: Color favorite_color;
      case pt_lotnum: numbers lottery_numbers;
      case pt_nickname: string nickname;
    };
    
    attribute Preferences prefs;
    attribute Face appearance;


    void set_pref ( in Preference p );
    Preference get_pref ( in PrefType t );
    any get_pref_any ( in PrefType t );

    void deposit( in Amount a );
    void withdraw( in Amount a ) raises (InsufficientFunds);
    long long add ( in long long a, in long long b );
    Amount balance();
    AcctCounter counter();
    void server_exit ();
  };
};