interface Message {
        extent messages;
        keys author,date,time;

        attribute string author;
        attribute string date;
        attribute string time;
        attribute string subject;
        attribute string recipients;
        attribute string cc_recipients;
        attribute string organization;
        attribute string body;

        relationship Folder in_folder
                inverse Folder::has_messages;
        relationship List<Message> has_replies
                inverse Message::is_reply_for
        {order_by Message::day,Message::time,Message::author};
        relationship Message is_reply_for
                inverse Message::has_replies;

        put(in Folder) raises(folder_not_exist);
        del(in Message) raises(message_not_exist);
}

interface Folder {
        extent folders;
        keys name;

        attribute string name;

        relationship List<Folder> is_parent_of
                inverse Folder::is_child_of
        {order_by Folder::name};
        relationship Folder is_child_of
                inverse Folder::is_parent_of;
        relationship List<Message> has_messages
                inverse Message::in_folder
        {order_by Message::author,Message::day,Message::time};
        add(in Folder) raises(folder_not_exist);
        del(in Folder) raises(folder_not_exist);
}