public EquatableHelper(ProcessedMethod method, SourceWriter headers, SourceWriter implementation) :
            base(method, headers, implementation)
        {
            ReturnType = "bool";
            var pt       = method.Method.GetParameters() [0].ParameterType;
            var objc     = NameGenerator.GetTypeName(pt);
            var nullable = !pt.IsPrimitive ? " * _Nullable" : "";

            ParameterType = pt;
            ObjCSignature = $"isEqualTo{objc.PascalCase ()}:({objc}{nullable})other";
            MonoSignature = $"Equals({NameGenerator.GetMonoName (pt)})";
        }
        protected void GenerateIndexedSubscriptingWrite(Type indexType, Type propertyType)
        {
            string indexTypeString = NameGenerator.GetTypeName(indexType);

            headers.WriteLine($"- (void)setObject:(id)obj atIndexedSubscript:({indexTypeString})idx;");

            implementation.WriteLine($"- (void)setObject:(id)obj atIndexedSubscript:({indexTypeString})idx");
            implementation.WriteLine("{");
            implementation.Indent++;
            implementation.WriteLine($"[self setItem:idx value:{FromNSObject (propertyType, "obj")}];");
            implementation.Indent--;
            implementation.WriteLine("}");
            implementation.WriteLine();
        }
        protected void GenerateIndexedSubscriptingRead(Type indexType, Type propertyType)
        {
            string indexTypeString = NameGenerator.GetTypeName(indexType);

            headers.WriteLine($"- (id)objectAtIndexedSubscript:({indexTypeString})idx;");

            implementation.WriteLine($"- (id)objectAtIndexedSubscript:({indexTypeString})idx");
            implementation.WriteLine("{");
            implementation.Indent++;
            implementation.WriteLine($"return {ToNSObject (propertyType, "[self getItem:idx]")};");
            implementation.Indent--;
            implementation.WriteLine("}");
            implementation.WriteLine();
        }
        protected void GenerateKeyedSubscriptingRead(Type indexType, Type propertyType)
        {
            string indexTypeString = NameGenerator.GetTypeName(indexType);

            // TODO - Technically the argument here can be anything, not just id
            headers.WriteLine($"- (id)objectForKeyedSubscript:(id)key;");

            implementation.WriteLine($"- (id)objectForKeyedSubscript:(id)key;");
            implementation.WriteLine("{");
            implementation.Indent++;
            implementation.WriteLine($"return {ToNSObject (propertyType, "[self getItem:key]")};");
            implementation.Indent--;
            implementation.WriteLine("}");
            implementation.WriteLine();
        }