--- /dev/null
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2014 Alexis Laferrière <alexis.laf@xymus.net>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Offers services to serialize a Nit objects to different persistent formats
+module serialization
+
+# Abstract serialization service to be sub-classed by specialized services.
+interface Serializer
+ # Main method of this service, serialize the `object`
+ fun serialize(object: nullable Serializable) is abstract
+
+ # Serialize an object as a "possible" reference, depending of the service
+ fun serialize_reference(object: Serializable) is abstract
+
+ # Serialize an attribute, used by `Serializable::core_serialize_to`
+ fun serialize_attribute(name: String, value: nullable Object)
+ do
+ if value isa Serializable then
+ value.serialize_to_or_delay(self)
+ else if value == null then
+ serialize value
+ else
+ warn("argument {value.class_name}::{name} is not serializable.")
+ end
+ end
+
+ # Warn of problems and potential errors (such as if an attribute
+ # is not serializable)
+ fun warn(msg: String) do print "Serialization warning: {msg}"
+end
+
+# Instances of this class can be passed to `Serializer::serialize`
+interface Serializable
+ # Full or true serialization
+ fun serialize_to(v: Serializer) do v.serialize(self)
+
+ # Body of the serialization of this class
+ # Can be redefed in sub classes and refinements
+ fun core_serialize_to(v: Serializer) do end
+
+ # Whether full serialization (calls `serialize_to`) or place only references
+ fun serialize_to_or_delay(v: Serializer) do v.serialize_reference(self)
+end
+
+# Instances of this class are not delayed and instead serialized immediately
+# This applies mainly to `universal` types
+interface DirectSerializable
+ super Serializable
+
+ redef fun serialize_to_or_delay(v) do serialize_to(v)
+end
+
+redef class Bool super DirectSerializable end
+redef class Char super DirectSerializable end
+redef class Int super DirectSerializable end
+redef class Float super DirectSerializable end
+redef class NativeString super DirectSerializable end
+redef class String super DirectSerializable end