MStatus AttributeParser::parseAttribute(MFnDependencyNode & node, MObject & attr)
	{
		MStatus status;

		MFnAttribute fnAttr(attr, &status);
		if (!status) return status;

		MString attrName = fnAttr.name(&status);
		if (!status) return status;

		if (attr.hasFn(MFn::kCompoundAttribute)) {
			// TODO
		}
		else if (attr.hasFn(MFn::kEnumAttribute)) {
			// TODO
		}
		else if (attr.hasFn(MFn::kGenericAttribute)) {
			// TODO
		}
		else if (attr.hasFn(MFn::kLightDataAttribute)) {
			// TODO
		}
		else if (attr.hasFn(MFn::kMatrixAttribute)) {
			// TODO
		}
		else if (attr.hasFn(MFn::kMessageAttribute)) {
			// TODO
		}
		else if (attr.hasFn(MFn::kNumericAttribute)) {
			return parseNumericAttribute(node, attr);
		}
		else if (attr.hasFn(MFn::kTypedAttribute)) {
			return parseTypedAttribute(node, attr);
		}
		else if (attr.hasFn(MFn::kUnitAttribute)) {
			// TODO
		}
		return MS::kSuccess;
	}
	void AttributeParser::parseAttribute(MFnDependencyNode & node, MObject & attr, std::set<String>& parsedAttributes)
	{
        AutoOnAfterAttribute onAfterAttribute(*this, node, attr);

        if (!onBeforeAttribute(node, attr)) {
            // Skip attribute
            return;
        }

        MStatus status;

		MFnAttribute fnAttr(attr, &status);
		if (!status) return;

		MString attrName = fnAttr.name(&status);
		if (!status) return;

		// First handle numeric compound types
		MFnNumericData::Type type;
		if (IsNumericCompoundAttribute(attr, type))
		{
			MPlug plug = node.findPlug(attr, &status);
			if (!status) return;

			parseNumeric(plug, type);

			// Mark children as parsed
			MFnCompoundAttribute fnCompoundAttribute(attr, &status);
			if (!status) return;

			unsigned int numChildren = fnCompoundAttribute.numChildren(&status);
			if (!status) return;

			for (unsigned int i = 0; i < fnCompoundAttribute.numChildren(); ++i)
			{
				MObject child = fnCompoundAttribute.child(i, &status);
				if (!status) return;

				MFnAttribute childFnAttr(child);
				parsedAttributes.insert(childFnAttr.name().asChar());
			}
		}
		// Other cases
		else if (attr.hasFn(MFn::kCompoundAttribute)) {
            parseCompoundAttribute(node, attr, parsedAttributes);
		}
		else if (attr.hasFn(MFn::kEnumAttribute)) {
            parseEnumAttribute(node, attr);
		}
		else if (attr.hasFn(MFn::kGenericAttribute)) {
			// TODO
		}
		else if (attr.hasFn(MFn::kLightDataAttribute)) {
			// TODO
		}
		else if (attr.hasFn(MFn::kMatrixAttribute)) {
            parseMatrixAttribute(node, attr);
		}
		else if (attr.hasFn(MFn::kMessageAttribute)) {
            parseMessageAttribute(node, attr);
		}
		else if (attr.hasFn(MFn::kNumericAttribute)) {
			parseNumericAttribute(node, attr);
		}
		else if (attr.hasFn(MFn::kTypedAttribute)) {
			parseTypedAttribute(node, attr);
		}
		else if (attr.hasFn(MFn::kUnitAttribute)) {
            parseUnitAttribute(node, attr);
		}
	}