public ObjectModel Disassemble(Component component, DisassemblyContext context)
        {
            var converter = GetComponentConverter(component.GetType());

            if (converter != null)
            {
                Component converted = converter.ConvertComponent(component, component.gameObject);
                return(context.MakeReferencable(component, (ObjectModel)Disassemble(converted, context).MakeExplicit(converted.GetType())));
            }

            var assembler = GetEngineComponentAssembler(component.GetType());

            if (assembler != null)
            {
                return(context.MakeReferencable(component, (ObjectModel)assembler.Disassemble(component, context).MakeExplicit(component.GetType()))); // Components are always explicit.
            }

            ObjectPopulator populator = new ObjectPopulator();

            return((ObjectModel)populator.Extract(component, context).MakeExplicit(component.GetType()));
        }
        public void Assemble(ObjectModel model, GameObject target, AssemblyContext context)
        {
            var serializer = GetEngineComponentAssembler(model.GetModelType());

            if (serializer != null)
            {
                Component comp = target.GetComponent(model.GetModelType());
                if (comp == null)
                {
                    comp = target.AddComponent(model.GetModelType());
                }

                serializer.Assemble(model, comp, context);
                context.MakeReferencable(comp, model.Guid);
                return;
            }

            Component       component = target.AddComponent(model.GetModelType());
            ObjectPopulator populator = new ObjectPopulator();

            populator.Populate(component, model, context);
        }