void IVisitor.Visit(BindingClass @class)
        {
            Generate(new ClassInstanceModel
            {
                BaseName          = @class.BaseName,
                OriginalName      = @class.OriginalName,
                Name              = @class.Name,
                OriginalNamespace = @class.OriginalNamespace,
                Namespace         = _options.Namespace,
                GenericArguments  = GenericRef(@class),
                Getters           = @class.Getters.Select(CreateMethod).ToArray(),
                Setters           = @class.Setters.Select(CreateMethod).ToArray(),
                Deleters          = @class.Deleters.Select(CreateMethod).ToArray(),
                Fields            = @class.GetAll <BindingField>().Select(m => CreateField(m.Key, m.Value)).ToArray()
            });

            Generate(new ClassPrototypeModel
            {
                OriginalName      = @class.OriginalName,
                Name              = @class.Name,
                OriginalNamespace = @class.OriginalNamespace,
                Namespace         = _options.Namespace,
                Prototype         = String.Concat("engine.Constructors.", @class.BaseName, ".PrototypeObject"),
                Events            = @class.GetAll <BindingEvent>().Select(m => CreateEvent(m.Key, m.Value)).ToArray(),
                Properties        = @class.GetAll <BindingProperty>().Select(m => CreateProperty(m.Key, m.Value)).ToArray(),
                Methods           = @class.GetAll <BindingMethod>().Select(m => CreateMethod(m.Key, m.Value)).ToArray()
            });

            Generate(new ClassConstructorModel
            {
                Name              = @class.Name,
                Namespace         = _options.Namespace,
                OriginalNamespace = @class.OriginalNamespace,
                OriginalName      = @class.OriginalName,
                Constructors      = @class.Constructors.Select(CreateMethod).ToArray(),
                Constants         = @class.GetAll <BindingField>().Select(m => CreateField(m.Key, m.Value)).ToArray()
            });

            _names.Include(@class.Name, @class.BaseName);
        }
        public static IEnumerable <BindingClass> GetBindings(this IDictionary <String, List <Type> > mappings)
        {
            foreach (var mapping in mappings)
            {
                var name  = mapping.Key;
                var types = mapping.Value;
                var type  = types.Where(m => !m.IsEnum).FirstOrDefault() ?? types.First();

                if (type.IsNotInterfaced())
                {
                    continue;
                }

                var binding = new BindingClass(name, type.Name.Replace("`1", ""), type.Namespace, type.ResolveBase());

                if (type.IsGenericType)
                {
                    var args = type.GetGenericArguments();
                    binding.GenericArguments.AddRange(args);
                }

                yield return(binding.GetClassBindings(types, name));
            }
        }